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

主要包含以下绘制步骤:

  1. 绘制画布

    /*
    * 绘制画布
    */
    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);
    }

    实现效果:

  2. 画中心小圆
    /*
    * 画小圆
    */
    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);
    }

    实现效果:

  3. 画仪表盘刻度线
    /*
    * 画刻度
    */
    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));
    }

    实现效果:

  4. 绘制刻度值
    /*
    * 画刻度值
    */
    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));
    }

    实现效果:

  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();
    }

    实现效果:

  6. 绘制指针扫过的扇形
    /*
    * 画扇形
    */
    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);
    }

    实现效果:

  7. 绘制渐变的内圆
    /*
    * 画渐变内圆
    */
    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);
    }

    实现效果:

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

    实现效果:

  9. 绘制当前数值
    /*
    * 绘制当前数值
    */
    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");
    }

    实现效果:

  10. 绘制发光外壳
    /*
    * 画外壳,发光外圈
    */
    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);
    }

    实现效果:

  11. 绘制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实现汽车仪表盘的更多相关文章

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

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

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

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

  3. Qt Creater 制作汽车仪表盘

    最近项目用到了模拟仪表,网上下载大神编写的按个仪表Meter没有成功 转战 QWt 编译后,在creater中仍然无法使用,只可以在代码中使用 百度说是我编译的版本不对 扔到 开始做自己的 这个用到了 ...

  4. Qt自定义控件之仪表盘1--简单的贴图仪表盘

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

  5. Qt编写echart仪表盘JS交互程序支持webkit和webengine(开源)

    Echart是百度研发团队开发的一款报表视图JS插件,功能十分强大,是本人用过的国产作品中最牛逼的,记得四五年前就在qt中使用过,当时用的浏览器控件是webkit,由于5.6以后的版本不再支持webk ...

  6. Qt编写自定义控件1-汽车仪表盘

    前言 汽车仪表盘几乎是qt写仪表盘控件中最常见的,一般来说先要求美工做好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图基本 ...

  7. Qt编写自定义控件大全

    最新版可执行文件 http://pan.baidu.com/s/1i491FQP 不定期增加控件及修正BUG和改进算法. 总图: 1:动画按钮 * 1:可设置显示的图像和底部的文字 * 2:可设置普通 ...

  8. Echarts——更改仪表盘方向和颜色

    做小项目需要用到仪表盘,官方给出的颜色设置如下: 而我想要如下样式的: 最后,经过一番折腾算是搞成了如下样式效果: 要达到上面效果关键在于设置Echarts的如下两处js代码: 1.大小值要颠倒,因为 ...

  9. QML - 实现Gstreamer投屏 投屏画面遮挡

    1.     背景介绍 中控端运行的操作系统是Android,中控软件主要功能有导航.收音机.媒体(音乐).蓝牙(连接).手机互联.行车辅助和系统设置等. 仪表端运行的操作系统是Linux,仪表软件主 ...

  10. 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. ...

随机推荐

  1. 9、iptables 防火墙

    1.iptables 基础规则 1.1.Linux 包过滤防火墙 netfilter 位于 Linux 内核中的包过滤功能体系 称为 Linux 防火墙的 "内核态" iptabl ...

  2. 报错:Client does not support authentication protocol requested by server; consider upgrading MySQL cli

    IDEA启动项目登录时显示用户或密码错误 或者 连接mysql数据库时报错 原因: mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是ca ...

  3. centos7桌面版安装百度网盘

    百度网盘官网下载Linux版本的软件 CentOS7的软件包格式为rpm # 安装依赖 yum -y install libXScrnSaver yum -y install libstdc++.so ...

  4. Android 开发中脚本 提高效率工具

    在安卓开发中我们常常需要获取日志,通常我们可以通过adb logcat 命令获取日志.同样,我没有可以通过脚本获取.其实质也是通过adb命令实现,只是把命名写入bat文件中,在win系统中直接双击就可 ...

  5. 2020年9月至10月 Splashtop 新功能

    ​ Splashtop 已为 Splashtop Business Access.Splashtop Remote Support.Splashtop SOS 和 Splashtop On-Prem ...

  6. .NET下免费开源的PDF类库(PDFSharp)

    前言 目前.NET 体系下常见的PDF类库有Aspose.QuestPDF.Spire.iTextSharp等,有一说一都挺好用的,我个人特别喜欢QuestPDF它基于 C# Fluent API 提 ...

  7. Your lock file does not contain a compatible set of packages. Please run composer update.

    执行composer install遇到错误:Your requirements could not be resolved to an installable set of packages. 这是 ...

  8. 5款超好用的AI换脸软件,一键视频直播换脸(附下载链接)

    随着AIGC的火爆,AI换脸技术也被广泛应用于娱乐.广告.电影制作等领域,本期文章系统介绍了市面上超火的5款AI软件 换脸整合包收录了全部5款AI工具,请按照需要选择下载: 百度网盘:https:// ...

  9. Servlet转发与重定向的资源路径问题解析

    一. 问题引入 转发和重定向可以说是Servlet中最重要的知识点也不为过,因为它决定着整个向Servlet体系中,执行流程的问题.      转发: request.getRequestDispat ...

  10. jquery加载页面时触发事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...