Qt | 实现一个简单的可以转动的仪表盘

news2024/11/28 22:46:06

环境:vs2017+Qt5.14.2


效果图:


准备工作:
效果图中的可以转动的仪表盘效果分为三个部分:

  1. 背景图(就是带去掉中间白色原点,去掉中间蓝色指针省下的部分);
  2. 指针图片(中间蓝色的指针部分,不包括指针上的白色圆点);
  3. 原点图片(中间白色的圆点)

原理:
在paintEvent()中绘制这三张图片。当需要旋转指针的角度时,改变指针图片的角度,再调用update()函数重新绘制显示就可以了。


具体实现:
1. 定义旋转角度成员变量:int m_nValue;//指针旋转角度。
2. 重载paintEvent()函数。
3. 加载三张图片。
QPixmap img = QPixmap(":/image/banhuan.png");
QPixmap needle = QPixmap(":/image/zhizhen.png");
QPixmap overlay = QPixmap(":/image/zhizhenyuan.png");
4. 在paintEvent()函数中进行绘制。

void CDialBox::paintEvent(QPaintEvent *event)
{
     QPainter painter(this);
     painter.save();//保存
     painter.setRenderHint(QPainter::SmoothPixmapTransform, true); //平滑像素图,防止图形走样
     painter.translate(this->width() / 2, this->height() / 2); // 原点定位在中间位置
     // 背景图
     painter.drawPixmap(-img->width() / 2, -img->height() / 2, img);
     // 指针图
     painter.rotate(m_nValue);//设置旋转角度
     painter.drawPixmap(-needle.width() / 2, -needle.height() + needle.width() / 2, needle);
     //原点图
     painter.drawPixmap(-overlay.width() / 2, -overlay.height() / 2, overlay);
     painter.restore();//恢复 
}
  • 其中:painter.save();painter.restore();为保存QPainter当前的状态和恢复QPainter当前的状态。这里使用这两个函数主要是服务于painter.translate()函数的。
  • 因为painter.translate(x, y)函数用来设置当前QPainter的相对坐标。正常QPainter的坐标原点(0,0)在屏幕的左上角,调用painter.translate(x, y)函数,会将原点设置为指定的(x,y)的位置,也就是说屏幕的(x,y)为QPainter画布的(0,0)位置。
  • 为了防止画布上的图片有缩放或拉伸导致的图像走形,可以调用painter.setRenderHint(QPainter::SmoothPixmapTransform, true);来进行平滑设置。
  • 在绘制图形时顺序很重要,先调用painter.drawPixmap()函数进行绘制的图形在最下面,后面调用的会覆盖在之前的图形之上,所以根据效果图,应该先绘制背景图片,再绘制指针图片,最后绘制原点图片。
  • 因为此时原点(0,0)的位置在效果图的最中间位置,所以绘制背景图时的(x,y)应该为(-img->width() / 2, -img->height() / 2);
  • 指针图的X值为负的宽度的一半,Y值为负的高度的值加上宽度的一半。 调用painter.rotate()函数是用来将画布以坐标原点为中心进行顺时针旋转指定的角度。所以定义一个成员变量来给这个角度进行传值。
    原点图的(x,y)应该为(-overlay.width() / 2, -overlay.height() / 2);


5.改变指针角度
定义一个改变指针角度值的函数void valueChanged(int value);

void CDialBox::valueChanged(int value) 
{
     m_nValue = value;
     update();
}

设置角度的值,调用update()函数进行刷新。调用update();函数会执行paintEvent();

 

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

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

相关文章

客户端发布后,一体机无法下载和安装

一、问题描述:客户端和服务端在不同网段,可以ping通IP,但是主机名ping不通,客户端提示『OPC 找不到主机名』 解决方法: 修改客户端机器的『hosts』文件,路径为: 『C:\Windows\System32\driver…

【初学人工智能原理】【2】方差代价函数:知错

前言 本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白,由于缺少图片可能无法理解,故放到了最后,建议直接看代码(代码放到了前面)。 代码实…

一、linux系统基础

一、搭建Linux学习环境 如何安装linux操作系统: (1)安装独立的Linux系统,不再安装其他操作系统。 (2)安装Windows与Linux并存的多操作系统,启动时通过菜单选择要启动的操作系统。 (3)在虚拟机中安装Linux操作系统。 本次学习采用第三种方式,在虚拟机中安装linux操…

清理 C 盘空间最简单的方法

目录 一、清理C盘空间 二、删除休眠文件 三、删除软件缓存 四、清理临时文件 一、清理C盘空间 Windows系统内置的磁盘,都带有清理功能,我们可以先来清理磁盘空间,鼠标选择C盘,右键【属性】,可以看到有个【磁盘清理…

irreader RSS 订阅源阅读器工具软件 - 一款强大的网络内容阅读器

irreader 是一款强大的网络内容阅读器,不仅支持订阅 RSS 文章,还能够订阅网站、播客等内容,将众多订阅源聚合于一处,告别纷杂的互联网信息。 方便的内置订阅源 软件界面采取源列表、文章列表和内容区三栏式布局,内置的…

Docker操作MongoDB启停

对于docker安装配置有疑问的可以看这一篇Docker概念、安装以及配置镜像加速器 docker images可查看docker已有镜像 docker pull mongo:5.0.16拉取镜像(可从DockerHub查找自己所需) docker ps -a查看docker进程 docker run --name mongo -d -p 27017:270…

原理解析:HyperBDR+华为云,高自动化低TCO的云容灾解决方案

什么是HyperBDR云容灾? HyperBDR云容灾是云原生业务级别容灾工具,充分利用云原生能力提升容灾效率,降低容灾TCO。采用块级别全量增量复制技术,备份效率高;最新无主机数据同步技术,让容灾数据存储成本更低&…

JS高级 -- 深入面向对象

1. 编程思想 1.1 面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 面向过程,就是按照我们分析好了的步骤,按照步骤解决问题 eg:蛋炒…

Win10电脑开机蓝屏多次重启无效怎么办?

Win10电脑开机蓝屏多次重启无效怎么办?有用户在使用电脑的时候遇到了系统蓝屏的问题,想要通过重新启动的方式来解决问题,但是多次重新启动电脑都还是遇到蓝屏的问题。那么这个情况要怎么去进行解决呢?来看看以下的处理方法吧。 准…

数字化转型导师坚鹏:数字化转型背景下的保险公司人力资源管理

数字化转型背景下的保险公司人力资源管理 课程背景: 很多保险公司存在以下问题: 不清楚保险公司数字化转型目前的发展阶段与重要应用? 不知道保险公司数字化转型给保险公司人力资源管理带来哪些机遇与挑战? 不知道保险公司…

速锐得从冷链管理数字网关看工业物联网的发展与创新

工业互联网倡导者将其称为“第三次创新”。但如果真是这样,我们就仍处于发展初期,因为数字互联网技术的全部潜能尚未在工业技术领域全面实现。 我们可以看到智能设备和智能系统开始与工业机器、处理器、云联结,但并没有形成行业规模。创建工…

使用express框架+mongodb快速搭建后端项目

首先node环境不用多说 然后我们使用express脚手架 express-generator 快速创建项目目录 全局安装express-generator npm i -g express-generator 复制代码 接着使用express命令创建项目, programnem是你的项目文件夹名 express <programname> 复制代码 然后我们就…

2023五一数学建模竞赛(五一赛)选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;无人机定点投放问题 这道题是传统的物理类题目&#xff0c;基本每次建模竞赛都会有。由于这道题目并未给明数据&#xff0c;所以数据获取和搜集资料是…

文件共享服务

~ 创建用户目录共享文件夹 ~ 本地目录为&#xff1a;d:/share\users&#xff0c;允许所有域用户可读可写。在本目录下为所有用户据添加一个以名称命名的文件夹&#xff0c;该文件夹将设置为所有域用户的home目录&#xff0c;用户登录计算机成功后&#xff0c;自动映射改在到H卷…

智尚转债上市价格预测

智尚转债 基本信息 转债名称&#xff1a;智尚转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;6.9958亿元。 正股名称&#xff1a;南山智尚&#xff0c;今日收盘价&#xff1a;11.49元&#xff0c;转股价格&#xff1a;12.33元。 当前转股价值 转债面值 …

R语言 | 因子

目录 一、使用factor()函数或as.factor()函数建立因子 二、指定缺失的Levels值 三、labels参数 四、因子的转换 五、数值型因子转换时常见的错误 六、再看levels参数 七、有序因子 八、table()函数 九、认识系统内建的数据集 在类别数据中&#xff0c;有些数据是可以排序…

适用于Windows PC和Mac的最佳录屏软件Camtasia2023强悍来袭

Camtasia2023是一款屏幕录制和视频剪辑软件&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 让您用更短的时间创作更多的视频。无需任何经验&…

继富士康之后,又一个8万人大厂转移印度,但仍在中国留有后路

日前消息指和硕旗下的昌硕工厂正在搬迁&#xff0c;预计将全数搬迁至印度&#xff0c;这是苹果代工厂之中又一家跟随苹果的脚步转移至印度&#xff0c;那么印度制造真的靠谱么&#xff1f; 苹果推动代工厂向印度转移似乎已是坚定不移&#xff0c;它最先推动纬创远赴印度设厂&am…

【Redis16】Redis进阶:内存优化

Redis进阶&#xff1a;内存优化 在基础学习的最后一篇&#xff0c;我们了解到了 Redis 的底层数据类型可以通过 OBJECT ENCODING 来进行查看。也了解过一些关于这些底层数据类型的知识。今天&#xff0c;我们就来更加深入的学习一下这些底层的数据类型&#xff0c;并据此来了解…

Opera 推出 Opera One,将取代 Opera 浏览器

Opera 日前推出了一款名为 Opera One 的新浏览器&#xff0c;该浏览器正处于开发者预览阶段&#xff0c;用户可以访问官网下载试用(链接)。这个浏览器的终极目标是在今年晚些时候取代其当家的 Opera 浏览器。 Opera One 遵循 "模块化设计理念"&#xff0c;并使用新的…