Qwt 使用QwtDial绘制汽车仪表盘

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_OBJECTpublic: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.hqwc.cn/news/156733.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索C++中的不变之美:const与构造函数的深度剖析

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 关于C的博客中&#xff0c;我们已经了解了六个默认函数中的四个&#xff0c;分别是构造函数、析构函数、拷贝构造函数以及函数的重载。但是这些函数都是有返回值与参数的。提到参数与返回…

MySQL启动后反复重新启动故障

MySQL版本为5.6.45 系统为Ubuntu 20.04 LTS 该服务器重启后&#xff0c;MySQL需要手动执行启动。 运行执行脚本后发现异常&#xff0c;如下图&#xff1a; 提示MySQL服务在不停重复启动。 反复使用ps -ef |grep mysql命令查看&#xff0c;发现mysql进程号一直在变化&#x…

Qlik Sense Enterprise 忘记PostgreSQL密码

在 Windows 上安装 Qlik Sense Enterprise 期间会提供密码。如果您忘记了该密码&#xff0c;则无法找回&#xff1b;但是&#xff0c;可以按照以下步骤重置密码。 如何在 Qlik 中重置忘记的 PostgreSQL 密码... - Qlik Community - 1712725 如果该过程完成后记录了密码错误的…

信号、进程、线程、I/O介绍

文章目录 信号进程进程通信线程可/不可重入函数线程同步互斥锁条件变量自旋锁读写锁 I/O操作阻塞/非阻塞I/OI/O多路复用存储映射I/O 信号 信号是事件发生时对进程的通知机制&#xff0c;可以看做软件中断。信号与硬件中断的相似之处在于其能够打断程序当前执行的正常流程。大多…

分享一下怎么做一个商城小程序

如何制作一个商城小程序&#xff1a;功能解析、设计思路与实现方法 一、引言 随着移动设备的普及和微信小程序的兴起&#xff0c;越来越多的消费者选择在商城小程序上进行购物。商城小程序具有便捷、高效、即用即走等特点&#xff0c;为企业提供了新的销售渠道和推广方式。本…

回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测

回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.WOA-CNN-SVM鲸鱼算法…

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

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

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包

一、Nginx导言 1、引言 Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;也可以充当负载均衡器、HTTP 缓存和安全防护设备。它的特点是内存占用小、稳定性高、并发性强、易于扩展&#xff0c;因此在互联网领域得到了广泛的使用。 总结出以下三点: 负载均衡&#x…

【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入

引言 在上一篇中我们介绍了MySQL ALTER命令及序列使用&#xff1b;在开发中&#xff0c;对MySQL重复数据的处理是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中重复数据的操作。 上一篇链接&#xff1a;【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令…

最新Ai智能创作系统源码V3.0,AI绘画系统/支持GPT联网提问/支持Prompt应用+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

pytorch 入门 (五)案例三:乳腺癌识别-VGG16实现

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】乳腺癌识别&#x1f356; 原作者&#xff1a;K同学啊 在本案例中&#xff0c;我将带大家探索一下深…