Qwt 使用QwtDial绘制汽车仪表盘

news2024/11/29 12:48:38

1.概述

QwtDial是Qwt库中的一个类,用于绘制一个可旋转的仪表盘。

以下是类继承关系:

2.常用方法

void setOrigin(double origin) 设置仪表盘的原点角度,以度为单位,默认为0度,正值为逆时针旋转,负值为顺时针旋转。

void setScaleArc (double minArc, double maxArc) 设置最小、最大角度

void setMinScaleArc (double) 设置刻度盘的最小角度

void setMaxScaleArc (double) 设置刻度盘的最大角度

void setValue(double value) 设置当前指示器的值。

void setNeedle(QwtDialSimpleNeedle *needle) 设置指针的样式,可以通过创建一个QwtDialNeedle指针对象并设置其样式来自定义指针。

void setScaleDraw (QwtRoundScaleDraw *) 设置绘制的坐标轴

void setScale (double lowerBound, double upperBound) 设置范围

void setScaleStepSize (double stepSize) 设置步长

3.示例


 

自定义SpeedoMeter类继承QwtDial。

#ifndef SPEEDOMETER_H
#define SPEEDOMETER_H

#include <QPainter>
#include "qwt_dial.h"
#include "qwt_round_scale_draw.h"
#include "qwt_dial_needle.h"

class SpeedoMeter : public QwtDial
{
public:
    SpeedoMeter( QWidget* parent = NULL );

    void setLabel( const QString& );
    QString label() const;

protected:
    virtual void drawScaleContents( QPainter* painter,
      const QPointF& center, double radius ) const QWT_OVERRIDE;

private:
    QString m_label;
};

#endif // SPEEDOMETER_H

#include "SpeedoMeter.h"
#include <QPainter>

SpeedoMeter::SpeedoMeter( QWidget* parent )
    : QwtDial( parent )
    , m_label( "km/h" )
{
    QwtRoundScaleDraw* scaleDraw = new QwtRoundScaleDraw();
    scaleDraw->setSpacing( 8 );
    scaleDraw->enableComponent( QwtAbstractScaleDraw::Backbone, false );
    scaleDraw->setTickLength( QwtScaleDiv::MinorTick, 0 );
    scaleDraw->setTickLength( QwtScaleDiv::MediumTick, 4 );
    scaleDraw->setTickLength( QwtScaleDiv::MajorTick, 8 );
    setScaleDraw( scaleDraw );

    setWrapping( false );
    setReadOnly( true );

    setOrigin( 135.0 );
    setScaleArc( 0.0, 270.0 );

    QwtDialSimpleNeedle* needle = new QwtDialSimpleNeedle(
        QwtDialSimpleNeedle::Arrow, true, Qt::red,
        QColor( Qt::gray ).lighter( 130 ) );
    setNeedle( needle );

    setScaleStepSize( 20.0 );
    setScale( 0.0, 240.0 );
    this->scaleDraw()->setPenWidthF( 2 );
}

void SpeedoMeter::setLabel( const QString& label )
{
    m_label = label;
    update();
}

QString SpeedoMeter::label() const
{
    return m_label;
}

void SpeedoMeter::drawScaleContents( QPainter* painter,
    const QPointF& center, double radius ) const
{
    QRectF rect( 0.0, 0.0, 2.0 * radius, 2.0 * radius - 10.0 );
    rect.moveCenter( center );

    const QColor color = palette().color( QPalette::Text );
    painter->setPen( color );

    const int flags = Qt::AlignBottom | Qt::AlignHCenter;
    painter->drawText( rect, flags, m_label );
}

使用:

#ifndef SPEEDOMETERWIDGET_H
#define SPEEDOMETERWIDGET_H

#include <QWidget>
#include <QTimerEvent>

namespace Ui {
class SpeedoMeterWidget;
}

class SpeedoMeterWidget : public QWidget
{
    Q_OBJECT

public:
    explicit SpeedoMeterWidget(QWidget *parent = 0);
    ~SpeedoMeterWidget();

    void changeSpeed();

protected:
    virtual void timerEvent( QTimerEvent* event );

private:
    Ui::SpeedoMeterWidget *ui;

    int m_timerId;
};

#endif // SPEEDOMETERWIDGET_H


#include "SpeedoMeterWidget.h"
#include "ui_SpeedoMeterWidget.h"
#include "qwt_dial.h"
#include "qwt_round_scale_draw.h"
#include "qwt_dial_needle.h"
#include "SpeedoMeter.h"

static QPalette colorTheme( const QColor& base )
{
    QPalette palette;
    palette.setColor( QPalette::Base, base );
    palette.setColor( QPalette::Window, base.darker( 150 ) );
    palette.setColor( QPalette::Mid, base.darker( 110 ) );
    palette.setColor( QPalette::Light, base.lighter( 170 ) );
    palette.setColor( QPalette::Dark, base.darker( 170 ) );
    palette.setColor( QPalette::Text, base.darker( 200 ).lighter( 800 ) );
    palette.setColor( QPalette::WindowText, base.darker( 200 ) );

    return palette;
}

static SpeedoMeter *g_dial = nullptr;
SpeedoMeterWidget::SpeedoMeterWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SpeedoMeterWidget)
{
    ui->setupUi(this);

    setPalette( colorTheme( QColor( Qt::darkGray ).darker( 150 ) ) );

    g_dial = new SpeedoMeter(this);
    g_dial->setFrameShadow( QwtDial::Sunken );
    ui->verticalLayout->addWidget(g_dial);

    m_timerId = startTimer( 50 );
}

SpeedoMeterWidget::~SpeedoMeterWidget()
{
    delete ui;
}

void SpeedoMeterWidget::changeSpeed()
{
    static double offset = 0.8;

    double speed = g_dial->value();

    if ( ( speed < 7.0 && offset < 0.0 ) ||
        ( speed > 203.0 && offset > 0.0 ) )
    {
        offset = -offset;
    }

    static int counter = 0;

    switch( counter++ % 12 )
    {
        case 0:
        case 2:
        case 7:
        case 8:
            break;
        default:
            g_dial->setValue( speed + offset );
    }
}

void SpeedoMeterWidget::timerEvent(QTimerEvent *event)
{
    if ( event->timerId() == m_timerId )
    {
        changeSpeed();
        return;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。每步可以删除任意一个字符串中的一个字符。 示例 思路 其实这道题的思路和最长公共子序列的思路一致&#xff0c;本题让我们求word1 和 word2 相同所需的最小步数&#xff0…

【QT】事件过滤器

事件过滤器1、给控件安装过滤器 2、重写过滤器事件bool eventFilter(两个参数); 基于上一个项目&#xff1a;【QT】事件分发器-CSDN博客 我的代码有问题&#xff0c;不能实现事件过滤器的功能&#xff0c;先记录下来 在头文件中要声明该函数。 #include "widget.h"…

单链表练习

单链表练习 相关内容&#xff1a; 1.再理解&#xff1a;LNode、*LinkList 2.单链表的整表创建&#xff08;头插法和尾插法&#xff09; 3.单链表的读取、插入、删除 4.单链表的整表删除 //单链表的初始化、创建、插入、删除、查找 //结点的结构体&#xff1a;数据域、指针域 …

Android应用程序的核心组件Activity

Activity组件 Activity组件是Android应用程序的核心组件之一&#xff0c;它提供了一个用户界面&#xff0c;用于与用户进行交互。每个Activity都是一个独立的屏幕&#xff0c;它可以包含用户界面元素&#xff08;如按钮、文本框等&#xff09;和逻辑代码&#xff0c;用于响应用…

玩了一下 Jenkins,最新版本 + JDK11

背景 今年五月的时候玩了一下 Jenkins&#xff0c;最新版本 2.414.3 &#xff0c;JDK 11 。本机有两个 JDK&#xff0c;只放到 Tomcat 里面了&#xff0c;看到了一个启动页面&#xff0c;后面有其他事情就忘记了。最近又想起来&#xff0c;觉得还是应该玩一下这么有技术含量的…

K8S的pod创建过程

创建流程图 用户发起请求创建deployment&#xff1b;apiserver收到创建资源的请求&#xff0c;apiserver对客户端操作进行身份认证&#xff0c;认证完成后接受该请求&#xff0c;并把相关的信息保存到etcd中&#xff0c;然后返回确认信息给客户端&#xff1b;apiserver向etcd…

【Python3】【力扣题】217. 存在重复元素

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;遍历每个元素&#xff0c;判断元素个数是否大于1。&#xff08;此方法不适用。超出时间限制&#xff09; class Solution:def containsDuplicate(self, nums: List[int]) -> bool:# 超…

优先队列----数据结构

概念 不知道你玩过英雄联盟吗&#xff1f;英雄联盟里面的防御塔会攻击离自己最近的小兵&#xff0c;但是如果有炮车兵在塔内&#xff0c;防御塔会优先攻击炮车&#xff08;因为炮车的威胁性更大&#xff09;&#xff0c;只有没有兵线在塔内时&#xff0c;防御塔才会攻击英雄。…

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了&#xff0c;近一年都在某个国企里工作&#xff0c;我做的就是嵌入式工程师的岗位&#xff0c;最近才刚刚退出来&#xff0c;想来说说自己的工作使用的软件和系统。 本身进公司的时候&#xff0c;其实做的就是写单片机的板子的程序的工作&#x…

8. 一文快速学懂常用工具——Linux命令(上)

本章讲解知识点 引言 指令学习 本专栏适合于软件开发刚入职的学生或人士&#xff0c;有一定的编程基础&#xff0c;帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化&#xff0c;尽量做到好记、言简意赅。如专栏内容有错漏&#xff0c;欢迎在评论区指…

西门子PLC ModbusTcp通信访问网关后从站(梯形图篇)

这篇文章和之前的" 西门子PLC ModbusTcp通信访问网关后从站(SCL语音轮询状态机FB) "属于姊妹篇,这里我们主要介绍梯形图代码如何实现ModbusTcp轮询。 SCL代码篇 西门子PLC ModbusTcp通信访问网关后从站(SCL语言轮询状态机FB)-CSDN博客文章浏览阅读6次。西门子PLC的…

创建超过1G内存大小的程序

正常情况一个进程最大占用内存为1G一下&#xff0c;如果程序有需求要使用超过1G大小的程序&#xff0c;可进行如下操作 VS修改设置&#xff1a;属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…

【数据结构】树形结构所有路径复原为链表

目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构&#xff0c;它表示元素之间层次关系。在树形结构中&#xff0c;每个节点可能拥有一个或多个子节点&#xff0c;形成了一个分层的结构。为了还原树形结构的路径&…

Linux的账号管理

本章的学习感觉如果不做系统管理员&#xff0c;作为简单了解就可以了 前面介绍了&#xff0c;用户&#xff0c;组&#xff0c;other三个角色&#xff0c; 每个用户创建都会有uid与之对应&#xff0c;创建的用户基本信息在一下两个文件中&#xff0c;也是我们要介绍的内容&…

天猫双11:秋冬换季呼吸健康受关注 呼吸机、雾化器、血氧仪成交翻番

10月31日晚8点&#xff0c;天猫双11正式开售&#xff0c;健康消费热情集中释放。秋冬换季&#xff0c;呼吸健康备受关注&#xff0c;呼吸机、雾化器、血氧仪成交翻番&#xff0c;中药滋补经典方增长近400%。天猫健康数据显示&#xff0c;小仙炖、Ulike、Swisse、可复美、敷尔佳…

网课搜题小程序源码/小猿题库多接口微信小程序源码+自带流量主

网课搜题小程序源码&#xff0c;多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序&#xff0c;可以开通流量主赚钱。 搭建教程 1、微信公众平台注册自己的小程序 2、下载微信开发者工具和小程序的源码 3、上传代码到自己的小程序 下载地址&…

车载网关让无人车栩栩如生:一款性价比车载终端案例

​无人车是汽车智能化的高形态,而连接无人车的大脑正是5G车载网关。今天让我们通过SV900-5G产品,感受一下无人车会带来怎样便利的生活场景。 详情查看&#xff1a;https://www.key-iot.com/iotlist/sv900.html 我们首先来到一座自动化工厂,几台小型AGV忙碌穿梭,它们都安装了SV…

跨国文件传输为什么要用专业的大文件传输软件?

跨国文件传输是许多跨国企业需要的基础工作&#xff0c;对于传输的质量和速度要求也是很严格的&#xff0c;随着数据量的不断增加&#xff0c;寻常传统的传输方式肯定是不行&#xff0c;需要新的技术和方式来进行传输&#xff0c;大文件传输软件应运而出&#xff0c;那它有什么…

如何创建一个react项目

文章目录 前言前言打开小黑窗口npm init vite后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&am…

【hive 面试题】聚合操作时null和‘‘对结果的影响

1、HiveSQL中 聚合操作时null和对结果的影响 代码示例&#xff1a; with temp as (select null as aunion allselect 111 as a union allselect 222 as a union allselect 333 as aunion allselect as a )select sum(a), -- null 不会参与运算, 会转换成0avg(a), -- null …