在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. kali使用apt-get update 出现数字签名失效

    kali使用apt-get update 出现数字签名失效 下载签名:wget archive.kali.org/archive-key.asc 安装签名:apt-key add archive-ke ...

  2. 联想G470安装黑苹果

    macos10136 黑苹果usb无线网卡 1.系统下载: 下面是我自制的带clover 4596版本的u盘镜像: 链接: https://pan.baidu.com/s/1wRdVddwkei7bf ...

  3. 小程序 image 高度自适应及裁剪问题

    在做微信小程序的商品详情页,商品的详情是图片集合,渲染完成后发现图片加载的很不自然,后来我把样式设置宽度 100%,并对 image 组件添加属性 mode="widthFix"解 ...

  4. Garnet:微软官方基于.NET开源的高性能分布式缓存存储数据库

    前言 前不久Redis宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSALv2 和 SSPLv1 协议,该协议变化意味着Redis不再开源.今天给大家分享一款完全开 ...

  5. python基础环境

    刚开始接触并学习一门开发语言,带着不求甚解的想法,其实也挺有好处的:我并不是所有的东西都知道,但是代码跑起来了. 但是时间久了,还是带着这种想法,可能就会遇到一些棘手的问题.比如电脑上不知不觉已经安装 ...

  6. Linux系统中如何查看磁盘情况

    Linux不像windows系统那样方便的图形界面,特别是作为服务器使用的时候,只有命令行可以使用. 我有个云服务器平时用来做一些数据分享用的,最近想看看磁盘和其中文件的占用情况,于是搜索并学习了一些 ...

  7. 【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态

    EXEC  sp_helpdb

  8. CSS操作——列表属性

    CSS中提供了一些列表属性可以用来: ​ (1).设置不同的列表项标记为有序列表 ​ (2).设置不同的列表项标记为无序列表 ​ (3).设置列表项标记为图像 list-style-type(系统提供 ...

  9. (JAVA)设计模式-适配器模式

    模式的定义和特点: 适配器模式(Adapter)是一种将一个类的接口转换成客户希望的另外一个接口的设计模式,可以提高代码的复用性和灵活性. 结构与实现: 定义一个适配器类来实现业务接口,再继承现有组件 ...

  10. 一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)

    前言 今天大姚给大家分享一款.NET开源(MIT License).免费.实用的多功能原神工具箱,旨在改善桌面端玩家的游戏体验:胡桃工具箱. 工具箱介绍 胡桃工具箱是一款.NET开源(MIT Lice ...