Qt实现汽车仪表盘
在UI界面显示中,仪表盘的应用相对比较广泛,经常用于显示速度值,电压电流值等等,最终实现效果如下动态图片(文末提供给源工程下载):

主要包含以下绘制步骤:
- 绘制画布
/*
* 绘制画布
*/
void Widget::initCanvas(QPainter &painter)
{
//消除锯齿
painter.setRenderHint(QPainter::Antialiasing,true);
//设置底色
painter.setBrush(QColor(0,0,0));
painter.drawRect(rect());
//平移坐标系原点位置
QPoint center(rect().width()/2, rect().height()*0.6);
painter.translate(center);
}实现效果:

- 画中心小圆
/*
* 画小圆
*/
void Widget::drawMiddleCircle(QPainter &painter, int radius)
{
//设置画笔颜色和宽度
painter.setPen(QPen(QColor(255,255,255),3));
//原点坐标(0,0)绘制半径为radius的圆
painter.drawEllipse(QPoint(0,0), radius, radius);
}实现效果:

- 画仪表盘刻度线
/*
* 画刻度
*/
void Widget::drawScaleLine(QPainter &painter, int radius)
{
//总计60个小刻度,每一个小刻度的角度值
angle = 240*1.0 / 60;
//保存当前坐标
painter.save();
painter.setPen(QPen(Qt::white, 5));
//设置起始刻度位置
painter.rotate(startAngle);
for(int i=0; i <=60; i++)
{
if( i>=40 )
{
//第40个刻度后,绘制画笔修改成红色
painter.setPen(QPen(Qt::red, 5));
}
if(i%5 == 0)
{
//绘制长刻度
painter.drawLine(radius-20, 0, radius-3, 0);
}
else
{
//绘制短刻度
painter.drawLine(radius-8, 0, radius-3, 0);
}
//绘制完一个刻度旋转一次坐标
painter.rotate(angle);
}
//恢复坐标
painter.restore();
painter.setPen(QPen(Qt::white, 5));
}实现效果:

- 绘制刻度值
/*
* 画刻度值
*/
void Widget::drawScaleValue(QPainter &painter, int radius)
{
//设置字体类型和大小
QFont textFont("Arial",15);
//设置粗体
textFont.setBold(true);
painter.setFont(textFont);
int text_r = radius - 49;
for(int i=0; i<=60; i++)
{
if(i%5 == 0)
{
if(i>=40)
{
painter.setPen(QPen(Qt::red, 5));
}
//保存当前坐标系
painter.save();
int delX = qCos((210-angle*i)*M_PI/180) * text_r;
int delY = qSin(qDegreesToRadians(210-angle*i)) * text_r;
//平移坐标系
painter.translate(QPoint(delX,-delY));
//旋转坐标系
painter.rotate(-120+angle*i);
//写上刻度值,文字居中
painter.drawText(-25,-25,50,30,Qt::AlignCenter,QString::number(i*4));
//恢复坐标系
painter.restore();
}
}
painter.setPen(QPen(Qt::white, 5));
}实现效果:

- 绘制仪表指针
/*
* 画指针
*/
void Widget::drawPoint(QPainter &painter, int radius)
{
//保存当前坐标
painter.save();
//设置画刷颜色
painter.setBrush(Qt::white);
//设置画笔为无线条
painter.setPen(Qt::NoPen);
static const QPointF points[4] = {
QPointF(0, 0.0),
QPointF(radius*2.0/3, -1.1),
QPointF(radius*2.0/3, 1.1),
QPointF(0, 15.0)
};
//坐标选旋转
painter.rotate(startAngle + angle * currentValue);
//绘制多边形
painter.drawPolygon(points, 4);
//恢复坐标
painter.restore();
}实现效果:

- 绘制指针扫过的扇形
/*
* 画扇形
*/
void Widget::drawSpeedSector(QPainter &painter, int radius)
{
//定义矩形区域
QRect rentangle(-radius, -radius, radius*2, radius*2);
//设置画笔无线条
painter.setPen(Qt::NoPen);
//设置画刷颜色
painter.setBrush(QColor(255,0,0,80));
//绘制扇形
painter.drawPie(rentangle, (360-startAngle)*16, -angle*currentValue*16);
}实现效果:

- 绘制渐变的内圆
/*
* 画渐变内圆
*/
void Widget::drawInnerEllipse(QPainter &painter, int radius)
{
QRadialGradient radial(0,0,radius);
//中心颜色
radial.setColorAt(0.0,QColor(255,0,0,200));
//外围颜色
radial.setColorAt(1.0,QColor(0,0,0,100));
//设置画刷渐变色
painter.setBrush(radial);
//画圆形
painter.drawEllipse(QPoint(0,0), radius, radius);
}实现效果:

- 绘制黑色内圈(用于显示速度值和单位的背景圆)
/*
* 画黑色内圈
*/
void Widget::drawInnerEllipseBlack(QPainter &painter, int radius)
{
//设置画刷
painter.setBrush(Qt::black);
//绘制圆形
painter.drawEllipse(QPoint(0,0), radius, radius);
}实现效果:

- 绘制当前数值
/*
* 绘制当前数值
*/
void Widget::drawCurrentSpeed(QPainter &painter)
{
painter.setPen(Qt::white);
//绘制数值
QFont font("Arial", 28);
font.setBold(true);
painter.setFont(font);
painter.drawText(QRect(-60,-60,120,70),Qt::AlignCenter,QString::number(currentValue*4));
//绘制单位
QFont font_u("Arial", 13);
painter.setFont(font_u);
painter.drawText(QRect(-60,-60,120,160),Qt::AlignCenter,"km/h");
}实现效果:

- 绘制发光外壳
/*
* 画外壳,发光外圈
*/
void Widget::drawEllipseOutSkirts(QPainter &painter, int radius)
{
//设置扇形绘制区域
QRect outAngle(-radius, -radius, 2*radius, 2*radius);
painter.setPen(Qt::NoPen);
//设置渐变色
QRadialGradient radia(0,0,radius);
radia.setColorAt(1,QColor(255,0,0,200));
radia.setColorAt(0.97,QColor(255,0,0,120));
radia.setColorAt(0.9,QColor(0,0,0,0));
radia.setColorAt(0,QColor(0,0,0,0));
painter.setBrush(radia);
//绘制圆形
painter.drawPie(outAngle,(360-150)*16,-angle*61*16);
}实现效果:

- 绘制Logo图标
/*
* 画LOGO
*/
void Widget::drawLogo(QPainter &painter, int radius)
{
//定义Logo绘制区域
QRect rectLogo(-65,radius*0.38,130,50);
painter.drawPixmap(rectLogo,QPixmap("./logo2.png"));
}实现效果:

源码下载链接如下:
DashBoad https://www.alipan.com/s/injYzUTNr5n 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
Qt实现汽车仪表盘的更多相关文章
- Qt自定义控件之仪表盘3--雷达扫描图
1.设计思想 雷达扫描图,在影视作品中见到较多,比如飞机雷达.舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置.和汽车仪表盘类似,汽车仪表盘有底盘背景图.同圆.刻 ...
- Qt自定义控件之仪表盘2--QPaint绘制仪表盘
0.前言 前面一篇文章写道了仪表盘的特点,实现了一个贴图的仪表盘,属于低配版本的仪表盘. 主要是有任何改动时候就需要重新设计图片,不能适配不同控件大小,即使让它自由拉伸,但仪表盘放大缩小时候显示 ...
- Qt Creater 制作汽车仪表盘
最近项目用到了模拟仪表,网上下载大神编写的按个仪表Meter没有成功 转战 QWt 编译后,在creater中仍然无法使用,只可以在代码中使用 百度说是我编译的版本不对 扔到 开始做自己的 这个用到了 ...
- Qt自定义控件之仪表盘1--简单的贴图仪表盘
0.前言 学程序首先要输出hell world,学电子要先来个流水灯.学Qt,那就必须先来个自定义控件,若有人问我从哪个下手,我推荐仪表盘,可简可繁,从低配到高配齐全,可入门也可进阶. 1.仪表盘解析 ...
- Qt编写echart仪表盘JS交互程序支持webkit和webengine(开源)
Echart是百度研发团队开发的一款报表视图JS插件,功能十分强大,是本人用过的国产作品中最牛逼的,记得四五年前就在qt中使用过,当时用的浏览器控件是webkit,由于5.6以后的版本不再支持webk ...
- Qt编写自定义控件1-汽车仪表盘
前言 汽车仪表盘几乎是qt写仪表盘控件中最常见的,一般来说先要求美工做好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图基本 ...
- Qt编写自定义控件大全
最新版可执行文件 http://pan.baidu.com/s/1i491FQP 不定期增加控件及修正BUG和改进算法. 总图: 1:动画按钮 * 1:可设置显示的图像和底部的文字 * 2:可设置普通 ...
- Echarts——更改仪表盘方向和颜色
做小项目需要用到仪表盘,官方给出的颜色设置如下: 而我想要如下样式的: 最后,经过一番折腾算是搞成了如下样式效果: 要达到上面效果关键在于设置Echarts的如下两处js代码: 1.大小值要颠倒,因为 ...
- QML - 实现Gstreamer投屏 投屏画面遮挡
1. 背景介绍 中控端运行的操作系统是Android,中控软件主要功能有导航.收音机.媒体(音乐).蓝牙(连接).手机互联.行车辅助和系统设置等. 仪表端运行的操作系统是Linux,仪表软件主 ...
- PyQt5 基本语法(五)
目录 2. 输入控件(二) 2.2 步长调节 2.2.1 QAbstractSpinBox 2.2.1.1 描述 2.2.1.2 功能作用 2.2.1.2.1 使用 2.2.1.2.2 主要功能 2. ...
随机推荐
- WEB服务与NGINX(24)- LNMP架构部署wordpress
目录 1. LNMP架构项目实战 1.1 LNMP架构介绍 1.2 LNMP架构部署wordpress 1.2.1 LNMP环境介绍 1.2.2 二进制部署mariadb 1.2.3 部署php-fp ...
- 那什么是URL、URI、URN?
URI Uniform Resource Identifier 统一资源标识符 URL Uniform Resource Locator 统一资源定位符 URN Uniform Resource Na ...
- C# 如何获取本机IP
百度搜索的方案 如果你去百度C#如何获取本机IP,那么大概率的你会得到以下的几段代码,第一种就是这样: string name = Dns.GetHostName(); IPAddress[] ipa ...
- WPF没修改代码出现InitializeComponent报错的解决办法
问题不在于我们做错了什么,之前还好好的,我们什么都没做,就报错了.这完全不是我们的问题. 我的建议是,直接做绝一点,删除obj和debug文件夹,让他自己重新生成一次
- go高并发之路——缓存穿透、缓存雪崩
缓存击穿.缓存穿透.缓存雪崩是使用Redis的三个经典问题,上篇文章讲了缓存击穿,今天就讲下剩下的两个问题. 一.缓存穿透 定义:缓存穿透是指查询一个根本不存在的数据,缓存层和DB层都不会命中.这样缓 ...
- ubuntu禁止指定的软件升级
禁止软件升级 sudo echo 软件包名 hold | sudo dpkg --set-selections 取消软件禁止升级的限制 sudo echo 软件包名 install | sudo dp ...
- 改造 Kubernetes 自定义调度器
原文出处:改造 Kubernetes 自定义调度器 | Jayden's Blog (jaydenchang.top) Overview Kubernetes 默认调度器在调度 Pod 时并不关心特殊 ...
- 开源Blazor UI组件库精选:让你的Blazor项目焕然一新!
今天给大家推荐一些开源.美观的Blazor UI组件库,这些优秀的开源框架和项目不仅能够帮助开发者们提高开发效率,还能够为他们的项目带来更加丰富的用户体验. 注:排名不分先后,都是十分优秀的开源框架和 ...
- Prism 基础知识学习(五)发布订阅
Prism 基础知识学习(五)发布订阅 在 ViewBViewModel.cs中 1 public class ViewBViewModel : IDialogAware 2 { 3 /// < ...
- 【阿里天池云-龙珠计划】薄书的机器学习笔记——快来一起挖掘幸福感!Task04
[给各位看官请安] 大家一起来集齐七龙珠召唤神龙吧!!! 学习地址:AI训练营机器学习-阿里云天池 推荐一下我由此上车的公众号:AI蜗牛车,时空序列相关文章挺多的. Task01:基于逻辑回归模型的多 ...