0、前言

学程序首先要输出hell world,学电子要先来个流水灯。学Qt,那就必须先来个自定义控件,若有人问我从哪个下手,我推荐仪表盘,可简可繁,从低配到高配齐全,可入门也可进阶。

1、仪表盘解析

以常见的、传统的仪表盘为例,分解仪表盘的元素,主要有边框、刻度、数字、指针(或数字值、代替指针或二者都有)。边框就是背景图,可以动态的绘出也可以用一个图片贴图,指针可以绘出也可以用图片旋转来实现。其他的有刻度、数字、以及随着数值变化而引起的特效。

2、贴图的仪表盘

贴图仪表盘比较简单。实现方式:先找好2张图,一张背景图,带有刻度数字指示的。一张指针图。程序运行的时候旋转指针就可以实现仪表盘动起来的效果。虽然方式很简陋,但在某些场合具有奇特的效果,比如嵌入式场合,大名鼎鼎的迪文工业屏,都是用着这种方式,使用者基本不需要任何编程,只导入两张漂亮的美工图,然后动态控制指针的旋转角度,就可以实现漂亮的仪表盘。

第一步,找资源:

第二步,添加资源文件到qt:

第三步:写dial类,使用painter重绘表盘和指针

#ifndef DIAL_H
#define DIAL_H #include <QWidget> class Dial : public QWidget
{
Q_OBJECT
public:
explicit Dial(QWidget *parent = nullptr); private:
int value;
void paintEvent(QPaintEvent *event); signals: public slots:
void valueChanged(int value);
}; #endif // DIAL_H #include "dial.h"
#include<QPainter>
#include<QDebug> Dial::Dial(QWidget *parent) : QWidget(parent)
{ } void Dial::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.save();
painter.setRenderHint(QPainter::SmoothPixmapTransform, true); //平滑像素图 painter.translate(this->width()/, this->height()/); // 原点定位
QPixmap img = QPixmap(":/image/background.png");
painter.drawPixmap(-img.width()/, -img.height()/, img); // 背景图 QPixmap needle;
needle.load(":/image/needle.png");
painter.rotate(value-);
painter.drawPixmap(-needle.width()/, -needle.height(), needle); // 绘制指针,默认图片针尖在上坐标(0,0),所以移动使针尾坐标为0 painter.rotate(-(value-)); // 恢复旋转,绘制蒙版层
QPixmap overlay = QPixmap(":/image/overlay.png");
painter.drawPixmap(-img.width()/ + , -img.height()/ + , overlay); painter.restore();
} void Dial::valueChanged(int value)
{
this->value = 2.7*value;
update();
}

第四步:调用dial类,把写好的类当做一个控件来使用即可,连接dial的槽函数即可控制表盘。

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this); this->setStyleSheet("QWidget { background-color:rgb(84, 84, 84); }");
QVBoxLayout *layout = new QVBoxLayout(this); slider = new QSlider(Qt::Orientation::Horizontal,this);
dial = new Dial(this); layout->addWidget(dial);
layout->addWidget(slider); connect(slider, &QSlider::valueChanged, dial, &Dial::valueChanged);
}

3、实现效果

动效图:

4、参考资料

qt 原厂demo ,本文只是使用了其资源文件,免得自己找图片。

欢迎界面搜索dial,自带UI Compontents:Dial Control Example。

Qt自定义控件之仪表盘1--简单的贴图仪表盘的更多相关文章

  1. Qt自定义控件之仪表盘2--QPaint绘制仪表盘

    0.前言 前面一篇文章写道了仪表盘的特点,实现了一个贴图的仪表盘,属于低配版本的仪表盘.    主要是有任何改动时候就需要重新设计图片,不能适配不同控件大小,即使让它自由拉伸,但仪表盘放大缩小时候显示 ...

  2. Qt自定义控件之仪表盘3--雷达扫描图

    1.设计思想 雷达扫描图,在影视作品中见到较多,比如飞机雷达.舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置.和汽车仪表盘类似,汽车仪表盘有底盘背景图.同圆.刻 ...

  3. 学习Qt Charts-创建一个简单的折线图

    一.Qt Charts Qt Charts是基于Qt Graphics View实现的一个图表的组件,可以用来在QT GUI程序中添加现在风格的.可交互的.以数据为中心的图表,可以用作QWidget或 ...

  4. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  5. jQuery 简单滑动轮播图效果

    一般页面简单轮播图效果用jQuery制作更加简单.我们来看看以下效果是如何来进行制作的. 其html结构下所示: <div id="box">         < ...

  6. 用matplotlib.pyplot画简单的折线图,直方图,散点图

    #coding=utf-8 """ 用matplotlib.pyplot画简单的折线图,直方图,散点图 """ import matplot ...

  7. JS---案例:简单轮播图

    案例:简单轮播图 div叫盒子,里面包了2个小盒子,一个是inner,一个是square inner的div是放ul,里面有li,a,和图片 square的div里面放span,是轮播图的小点 < ...

  8. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

  9. Qt自定义控件大全(一)云台仪表盘控件

    做过安防视频监控的同学都清楚,在视频监控系统软件上都可以看到一个云台控制区域,可以对球机进行下下左右等八个方位的运动控制,还可以进行复位,一般都是美工作图好,然后贴图的形式加入到软件中,好处是程序简单 ...

随机推荐

  1. Python3笔记009 - 2.6 输入和输出

    第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.6 输入和输出 1.input()函数 name = input("请输入姓名:& ...

  2. Dubbo远程调用之公司内部提供的服务

    公司内部提供的服务 一家对外提供服务的公司,例如百度,腾讯,阿里,京东,58 同城等,公司内部有多个事业群,事业部门,每个事业部门内部又有若干个子部门,子部门里面有多个不同的小组负责各自的业务.提供对 ...

  3. Java 添加、下载、读取PDF附件信息(基于Spire.Cloud.SDK for Java)

    Spire.Cloud.SDK for Java提供了PdfAttachmentsApi接口添加附件addAttachment().下载附件downloadAttachment().获取附件信息get ...

  4. Docker数据卷的介绍和使用

    最近在学习docker,这篇主要讲了数据卷的作用以及使用,我用的是mac系统去操作的 1.数据卷的简介 2.数据卷的配置 (1).查看你的镜像docker images (2)运行的命令 ~$ doc ...

  5. Python入门002

    1.编程语言介绍 分类:机器语言汇编语言高级语言(编译型.解释型号) 总结:#1.执行效率:机器语言>汇编语言>高级语言(编译型>解释型) #2.开发效率:机器语言<汇编语言& ...

  6. Blazor带我重玩前端(三)

    写在前面 需要升级VS2019以及.NET Core到最新版(具体的最低支持,我已经忘了,总是越新支持的就越好),以更好的支持自己开发Blazor项目. WebAssembly 搜索Blazor模板 ...

  7. java 面向对象(三十六):泛型五 通配符

    1.通配符的使用 /* 通配符的使用 通配符:? 类A是类B的父类,G<A>和G<B>是没关系的,二者共同的父类是:G<?> */ @Test public voi ...

  8. java 基本语法(二) 变量的使用(重点)

    1.变量的分类1.1 按数据类型分类 详细说明://1. 整型:byte(1字节=8bit) \ short(2字节) \ int(4字节) \ long(8字节) //① byte范围:-128 ~ ...

  9. 数据可视化之分析篇(三)Power BI总计行错误,这个技巧一定要掌握

    https://zhuanlan.zhihu.com/p/102567707 ​前一段介绍过一个客户购买频次统计的案例: Power BI 数据分析应用:客户购买频次分布. 我并没有在文章中显示总计行 ...

  10. 找出系统web路径

    方法一 :打开web查看源码,复制一个特征字符串,然后替换进下面命令的htmlString搜索之. Win :findstr /s/i/n /d:E:\code\xampp\htdocs\ /c:&q ...