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

简介: 通过paint实现一个可以转动的仪表盘。

环境: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();

目录
相关文章
|
程序员 C语言
Qt编写自定义控件49-飞机仪表盘
一、前言 飞行仪表是测定和表示飞机数据的工具,飞机中必不可少的一部分,飞行员根据飞行仪表表示的数据才能正确地做出判断。一般飞机仪表包括高度表+空速表+垂直速率表+姿态仪+航向指示表+转弯协调表。这次要绘制的是其中的姿势仪,显示飞机相对于地平线的姿态,看姿态仪,飞行员能判断飞机姿态为偏左偏右,及偏上和偏下。
1607 0
|
编解码 开发工具 C语言
Qt编写自定义控件10-云台仪表盘
一、前言 做过安防视频监控的同学都清楚,在视频监控系统软件上都可以看到一个云台控制区域,可以对球机进行下下左右等八个方位的运动控制,还可以进行复位,一般都是美工作图好,然后贴图的形式加入到软件中,好处是程序简单,界面美工,主要取决于美工的美图能力,缺点是对于各种分辨率的适应性稍微差点,需要不同的图片切图贴图,除非默认做好的是大图自适应看不出差别,可能大部分人所在的公司都是小公司,一般美工人员比较少甚至没有,都需要程序员一人负责,甚至一开始就要考虑到各种分辨率的应用场景以及后期可能的换肤换色等。
1342 0
|
计算机视觉 容器
Qt开发笔记之Qwt(二):Qwt仪表盘的基本使用
Qt开发笔记之Qwt(二):Qwt仪表盘的基本使用
Qt开发笔记之Qwt(二):Qwt仪表盘的基本使用
Qt qml 华为太空人仪表盘
欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。
229 0
Qt qml 华为太空人仪表盘
|
5G
Qt [GC9-16]:液晶仪表盘介绍
Qt [GC9-16]:液晶仪表盘介绍
146 1
Qt [GC9-16]:液晶仪表盘介绍
Qt Creater 制作汽车仪表盘
最近项目用到了模拟仪表,网上下载大神编写的按个仪表Meter没有成功 转战 QWt 编译后,在creater中仍然无法使用,只可以在代码中使用
214 0
Qt Creater 制作汽车仪表盘
|
程序员 C语言
Qt编写自定义控件54-时钟仪表盘
一、前言 这个控件没有太多的应用场景,主要就是练手,论美观的话比不上之前发过的一个图片时钟控件,所以此控件也是作为一个基础的绘制demo出现在Qt源码中,我们可以在Qt的安装目录下找到一个时钟控件的绘制,甚至还有qml版本,本控件无非就是一个仪表边框加上时钟分钟刻度再加上时分秒指针,打完收工,我是在此基础上增加了可以设置各种颜色,然后鼠标右键可设置四种效果 普通效果/弹簧效果/连续效果/隐藏效果,弹簧效果的意思是秒钟走动的时候,先移动到超过指定位置,然后又重新弹回来,连续效果的意思是将步长减少,一点点的移动,将秒钟的定时器精度调高。
1086 0
|
程序员 C语言
Qt编写自定义控件51-可输入仪表盘
一、前言 这个控件是近期定制的控件,还是比较实用的控件之一,用户主要是提了三点需求,一点是切换焦点的时候控件放大突出显示,一点是可直接输入或者编辑值,还有一点是支持上下键及翻页键和鼠标滚轮来动态修改值,类似于qspinbox控件。
1661 0

热门文章

最新文章

推荐镜像

更多