当前位置:网站首页>Qt | 实现一个简单的可以转动的仪表盘
Qt | 实现一个简单的可以转动的仪表盘
2022-08-02 14:12:00 【华为云】
环境: vs2017+Qt5.14.2
效果图:
准备工作:
效果图中的可以转动的仪表盘效果分为三个部分:
背景图(就是带去掉中间白色原点,去掉中间蓝色指针省下的部分);
指针图片(中间蓝色的指针部分,不包括指针上的白色圆点);
原点图片(中间白色的圆点)
原理:
在 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();
边栏推荐
猜你喜欢
Unity-3D数学
Open the door of electricity "Circuit" (1): voltage, current, reference direction
Detailed introduction to drawing complex surfaces using the plot_surface command
深入理解Golang之Map
6.统一记录日志
测试用例练习
pygame draw arc
Open the door to electricity "Circuit" (3): Talk about different resistance and conductance
Mysql lock
二叉排序树与 set、map
随机推荐
永久更改pip源
关于推荐系统的随想
3.用户上传头像
Test case exercises
Project: combing the database table
6. Unified logging
Based on the least squares linear regression equation coefficient estimation
测试用例练习
cmake configure libtorch error Failed to compute shorthash for libnvrtc.so
Software Testing Basics (Back)
casbin模型
Open the door of power and electricity "Circuit" (2): Power Calculation and Judgment
背包问题-动态规划-理论篇
二叉排序树与 set、map
2021-03-12
What should I do if Windows 10 cannot connect to the printer?Solutions for not using the printer
shader入门精要1
企业的电子签名、私钥签名
unity-shader(中级)
MATLAB绘图函数ezplot入门详解