当前位置: 首页 > news >正文

【Qt绘制仪表盘】

目的

使用Qt的绘制事件绘制一个仪表盘

思路

  1. 需要创建一个带绘制事件的控件
  2. 重写绘制事件
  3. 显示

实现

以下是实现代码,可复制到程序到,直接运行。

.h
// GaugeWidget.h
#ifndef GAUGEWIDGET_H
#define GAUGEWIDGET_H#include <QWidget>class GaugeWidget : public QWidget
{Q_OBJECT
public:explicit GaugeWidget(QWidget *parent = nullptr);void setValue(qreal value){m_value = value;}protected:void paintEvent(QPaintEvent *event) override;private:qreal m_value;
};#endif // GAUGEWIDGET_H
.h分析
  • 继承QWidget类,重新实现void paintEvent(QPaintEvent *event) override;事件;
  • 设置仪表盘当前的数据void setValue(qreal value){m_value = value;}
.cpp
// GaugeWidget.cpp
#include "GaugeWidget.h"
#include <QPainter>#include <QDebug>
GaugeWidget::GaugeWidget(QWidget *parent) : QWidget(parent), m_value(0)
{}void GaugeWidget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << this->size();// 绘制表盘painter.save();painter.translate(width()/2, height()/2);painter.setPen(Qt::NoPen);painter.setBrush(QBrush(QColor(255, 255, 255)));painter.drawEllipse(-100, -100, 200, 200);painter.setBrush(QBrush(QColor(200, 200, 200)));painter.drawEllipse(-95, -95, 190, 190);static const int majorTickCount = 12;static const int minorTickCount = 5;QFont font;font.setPointSize(8);painter.setFont(font);painter.save();for (int i = 0; i <= majorTickCount; i++) {qreal angle = i * 360.0 / majorTickCount;painter.rotate(angle);// 绘制刻度线if (i < majorTickCount) {painter.setPen(QPen(QColor(255, 255, 255), 2));painter.drawLine(0, -85, 0, -95);}// 绘制刻度值if (i % 2 == 0) {painter.setPen(QPen(QColor(255, 0, 0)));qreal value = i * 360.0 / majorTickCount;QString text = QString::number(value, 'f', 0);QRectF textRect(-50, -100, 100, 100);painter.drawText(textRect, Qt::AlignTop|Qt::AlignHCenter, text);}painter.rotate(-angle);}for (int i = 0; i < majorTickCount; i++) {for (int j = 1; j <= minorTickCount; j++) {qreal angle = (i + j / (qreal)minorTickCount) * 360.0 / majorTickCount;painter.save();painter.rotate(angle);painter.setPen(QPen(QColor(255, 255, 255), 1));painter.drawLine(0, -90, 0, -95);painter.restore();}}painter.restore();// 绘制指针qreal angle = (m_value / 60.0+0.5) * 360;painter.rotate(angle);painter.setPen(QPen(QColor(255, 0, 0), 3));painter.drawLine(0, 0, 0, 60);painter.restore();
}
.cpp分析

paintEvent函数是继承自QWidget的paintEvent事件处理函数,用于绘制小部件的界面。paintEvent函数首先创建一个QPainter对象,然后设置抗锯齿渲染。其余部分主要是绘制仪表盘和指针。具体绘制过程如下:

  1. 绘制表盘:
  • 将绘图原点平移到小部件的中心。

  • 绘制外圆和内圆,用QBrush用来填充圆形。

  • 根据majorTickCount(12)的值循环绘制刻度线和刻度值。每次循环需要计算出角度,然后将绘图原点旋转该角度。

  • 如果当前是大刻度线,则用QPen绘制白色线条。

  • 如果当前是大刻度线的偶数,则用QPen绘制红色刻度值,绘制完成后将绘图原点旋转回来。

  • 根据majorTickCount(12)和minorTickCount(5)的值循环绘制小刻度线。每次循环需要计算出角度,然后将绘图原点旋转该角度,绘制小刻度线,然后将绘图原点旋转回来。

  1. 绘制指针:
  • 根据m_value的值计算出指针应该指向的角度,并将绘图原点旋转该角度。
  • 用QPen绘制红色的指针线。
  • 将绘图原点旋转回来。
在MainWindow中使用自定义控件类GaugeWidget,测试表盘绘制效果:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "GaugeWidget.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);GaugeWidget *gaugeWidget = new GaugeWidget;setCentralWidget(gaugeWidget);gaugeWidget->setValue(40);
}MainWindow::~MainWindow()
{delete ui;
}
编译运行程序,效果如下:

在这里插入图片描述

结论

繁华到极致,腐朽到荒凉

相关文章:

  • [个人笔记] Windows的IT运维笔记
  • Django QuerySet.order_by SQL注入漏洞(CVE-2021-35042)
  • Unity中颜色空间Gamma与Linear
  • Locust AI 例子
  • EtherCAT主站SOEM -- 8 -- SOEM之 ec_slave 结构体详细分析
  • 一种全新且灵活的 Prompt 对齐优化技术
  • Mysql面经
  • 量化交易:筹码理论的探索-筹码分布计算的实现
  • 2022年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Calling PeopleTools APIs 调用PeopleTools API
  • GPU和CPU的联系和区别是什么,各自有什么特点,
  • Java基准测试工具JMH的简介与使用
  • Day45:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
  • Node.js下载安装及配置镜像源
  • vivo开发者链接
  • Android框架之Volley
  • JavaScript异步流程控制的前世今生
  • Java反射-动态类加载和重新加载
  • JAVA之继承和多态
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • webpack4 一点通
  • win10下安装mysql5.7
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 微信小程序设置上一页数据
  • 我这样减少了26.5M Java内存!
  • 在weex里面使用chart图表
  • 自制字幕遮挡器
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​批处理文件中的errorlevel用法
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Linux(Source Insight安装及工程建立)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (搬运以学习)flask 上下文的实现
  • (差分)胡桃爱原石
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)ABI是什么
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .bat批处理(六):替换字符串中匹配的子串
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Core 中间件验签
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net 调用php,php 调用.net com组件 --
  • .net 生成二级域名
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET程序员迈向卓越的必由之路
  • .net和php怎么连接,php和apache之间如何连接
  • .NET使用存储过程实现对数据库的增删改查