用Qt画一个仪表盘
关于Qt
Qt是一个跨平台的C++图形用户界面应用程序框架,通过使用Qt,可以快速开发出跨平台的多平台应用程序,包括Windows、Mac OS X、Linux和其他Unix系统。Qt提供了强大的图形操作界面(GUI)程序开发和移植的能力,以及对网络、数据库和其他技术的支持,能够满足多平台应用程序的需求。
用Qt画一个仪表盘
可以使用Qt的QPainter类来绘制仪表盘,主要的步骤如下:
- 创建一个QWidget类的实例,并给它一个合适的大小
- 在QWidget的paintEvent()函数中创建QPainter实例并设置其属性
- 确定仪表盘的中心点和外围矩形,并使用 QPainter.drawEllipse()绘制外围圆环
- 使用QPainter.drawLine()绘制指针,指针的位置可以使用QPainter.rotate()方法来计算
- 使用QPainter.drawText()绘制文字,文字的位置可以使用QPainter.rotate()方法来计算
- 使用QPainter.drawArc()绘制刻度环
- 使用QPainter.drawText()绘制刻度文字
- 使用 QPainter.drawText()绘制标题文字
- 校正指针和文字
- 使用QPainter.end()结束绘制
示例1如下:void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);// 绘制外圆painter.setPen(Qt::NoPen);painter.setBrush(Qt::white);painter.drawEllipse(rect());// 绘制分隔线int step = 30;painter.setPen(Qt::black);for (int i = 0; i <= 360; i += step) {painter.drawLine(rect().center(), pointOnCircle(rect().center(), rect().width() / 2, i));}// 绘制指针painter.setPen(Qt::NoPen);painter.setBrush(Qt::red);painter.drawConvexPolygon(m_pointer, 3);
}
示例2如下:void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);// 设置画笔QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.translate(width() / 2, height() /2); // 将坐标原点移动到中心点// 绘制仪表盘背景int radius = qMin(width(), height()) / 2; // 半径painter.drawEllipse(-radius, -radius, 2 * radius, 2 * radius);// 绘制仪表盘指针painter.rotate(m_value * 360.0 / m_maxValue);QPen pen;pen.setWidth(radius / 10);pen.setColor(Qt::black);painter.setPen(pen);painter.drawLine(0, 0, 0, -radius);
}
示例3如下:void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)int width = this->width();int height = this->height();int side = qMin(width, height);// 画背景QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.translate(width / 2, height / 2);painter.scale(side / 200.0, side / 200.0);painter.setPen(Qt::NoPen);// 画背景painter.setBrush(Qt::white);painter.drawEllipse(-100, -100, 200, 200);// 画刻度线painter.setPen(QPen(Qt::black, 1));int n = 12;for (int i = 0; i < n; ++i) {painter.drawLine(0, -90, 0, -96);painter.rotate(360.0 / n);}// 画数字painter.setPen(Qt::black);painter.setFont(QFont("Arial", 10));for (int i = 0; i < n; ++i) {int value = i * 30;QString str = QString("%1").arg(value);QRectF textRect(-20, -96, 40, 16);painter.drawText(textRect, Qt::AlignCenter, str);painter.rotate(360.0 / n);}// 画指针painter.setBrush(Qt::red);painter.save();painter.rotate(m_value);painter.drawConvexPolygon(m_points, 3);painter.restore();
}
示例4如下:// 绘制仪表盘
void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿painter.translate(width() / 2, height() / 2); // 坐标系原点移动到界面中心int side = qMin(width(), height());painter.scale(side / 200.0, side / 200.0); // 缩放坐标系// 绘制外圆painter.setPen(QPen(Qt::black, 3));painter.setBrush(Qt::white);painter.drawEllipse(-100, -100, 200, 200);// 绘制刻度painter.setPen(QPen(Qt::black, 2));for (int i = 0; i < 360; ++i) {if (i % 30 == 0) {painter.drawLine(0, -90, 0, -80);painter.drawText(-5, -70, QString::number(i / 30));} else {painter.drawLine(0, -95, 0, -80);}painter.rotate(1.0); // 旋转坐标系}// 绘制指针painter.setPen(QPen(Qt::red, 2));painter.drawLine(0, 0, 0, -60);painter.setPen(QPen(Qt::darkRed, 3));painter.drawLine(0, 0, 0, -70);
}
相关文章:
用Qt画一个仪表盘
关于Qt Qt是一个跨平台的C图形用户界面应用程序框架,通过使用Qt,可以快速开发出跨平台的多平台应用程序,包括Windows、Mac OS X、Linux和其他Unix系统。Qt提供了强大的图形操作界面(GUI)程序开发和移植的能力…...
linux 端口查询命令
任何知识都是用进废退,有段时间没摸linux,这大脑里的知识点仿佛全部消失了,就无语。 索性,再写一篇记录,加强一下记忆,下次需要就看自己的资料好了。lsof命令Linux端口查询命令可以通过lsof实现:…...
C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()
C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用:字符串查找。在一串字符串中,查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char*的指针 原理:如果在str1中找到了str2&…...
【学习笔记】人工智能哲学研究:《心智、语言和机器》
关于人工智能哲学,我曾在这篇文章里 【脑洞大开】从哲学角度看人工智能:介绍徐英瑾的《心智、语言和机器》 做过介绍。图片来源:http://product.dangdang.com/29419969.html在我完成了一些人工智能相关的工作以后,我再来分享《心智…...
设计模式之门面模式(外观模式)
目录 1.模式定义 2.应用场景 2.1 电源总开关例子 2.2 股民炒股场景 编辑 3. 实例如下 4. 门面模式的优缺点 传送门: 项目中用到的责任链模式 给对象讲工厂模式,必须易懂易会 策略模式,工作中你用上了吗? 1.模式定…...
MySQL - 多表查询
目录1. 多表查询示例2. 多表查询分类2.1 等/非等值连接2.1.1 等值连接2.1.2非等值连接2.2 自然/非自然连接2.3 内/外连接2.3.1 内连接2.3.2 外连接3.UNION的使用3.1 合并查询结果3.1.1 UNION操作符3.1.2 UNION ALL操作符4. 7种JOIN操作5. join 多张表多表查询,也称为…...
自定义报表是什么?
自定义报表是指根据用户的需求和要求,自行设计和生成的报表。自定义报表可以根据用户的具体需求,选择需要的数据和指标,进行灵活的排列和组合,生成符合用户要求的报表。自定义报表可以帮助用户更好地了解业务情况,发现…...
windows安装docker-小白用【避坑】【伸手党福利】
目录实操开启 Hyper-V 和容器特性下载docker安装dockercmd中,使用命令测试是否成功报错解决办法:下载linux模拟器wsl:双击打开docker重新打开cmd,输入命令,成功显示sever和clinet实操 开启 Hyper-V 和容器特性 控制面…...
环形链表相关的练习
目录 一、相交链表 二、环形链表 三、环形链表 || 一、相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据…...
C++ 提示对话框
头文件 #include<iostream>#include<cstdio> using namespace std; 函数格式 MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) 参数 hWnd :此参数代表消息框拥有的窗口。如果为NULL,则消息框没有拥有窗口。 lp…...
SprintBoot打包及profile文件配置
打成Jar包 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中,可以使用maven的package;运行: java -jar xxx(jar包名) 操作步骤 第一步: 引入Spring Boot打包插件 <!--打包的插件--> <build><!--修改jar的名字--><fi…...
java面试-java集合
说说你如何选用集合? 需要键值对选用 map 接口下的集合,需要排序用 TreeMap, 不需要排序用 HashMap 不需要键值对仅存放元素则选择 Collection 下实现的接口,保证元素唯一使用 Set, 不需要则选用 List Collection 和 Collections 有什么区别…...
Node.js简介
客户端访问网页时向服务器端发送请求要访问服务器中的页面,服务器收到请求后向数据库中进行搜索,搜索到相关数据然后返回结果给客户端显示; 这个过程就类似于:客人(客户端)去饭馆(服务端&#…...
每天学一点之Lambda表达式
Lambda表达式 思想导入: 函数式编程思想: 在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。编程中的函数,也有类似的概念,你调用我的时候,给我实参为形参赋…...
Raft分布式共识算法学习笔记
1. Raft算法 Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多 从本质上说&am…...
中介者模式
介绍 Java中介者模式(Mediator Pattern)是一种行为设计模式,它可以降低多个对象之间的耦合性,通过一个中介者对象来协调这些对象的交互. 在中介者模式中,多个对象之间的交互不是直接进行的,而是通过一个中介者对象来进行的.这个中介者对象封装了对象之间的交互逻辑,每个对象只…...
Kaggle赛题解析:Google手语识别
文章目录一、比赛前言信息二、比赛背景三、比赛任务四、评价指标五、数据描述六、解题思路一、比赛前言信息 比赛名称:Google - Isolated Sign Language Recognition 中文名称:帮助用户从PopSign游戏学习美国手语 比赛链接:https://www.ka…...
什么是ChatGPT?
目录前言一、什么是GPT?二、什么是ChatGPT?三、ChatGPT应用场景四、ChatGPT未来展望五、OpenAI介绍前言 3月3号,早上6:30就有人发消息给我,来问我有关GPT API的事件。 那是因为3月2号,OpenAI 发布了ChatGPT 3.5的开放…...
深入理解Zookeeper的ZAB协议
ZAB是什么ZAB(Zookeeper Atomic Broadcast):Zookeeper原子广播ZAB是为了保证Zookeeper数据一致性而产生的算法(指的是Zookeeper集群模式)。它不仅能解决正常情况下的数据一致性问题,还可以保证主节点发生宕…...
opencv-图像几何处理
缩放 缩放只是调整图像的大小。为此,opencv提供了一个cv2.resize()函数,可以手动指定图像大小,也可以指定缩放因子。你可以使用任意一种方法调整图像的大小: import cv2 from matplotlib import pyplot as pltlogo cv2.imread(…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
