首页 > 其他分享 >Qt实现汽车仪表盘

Qt实现汽车仪表盘

时间:2024-07-05 10:33:38浏览次数:16  
标签:Qt int 汽车 radius QPainter 仪表盘 绘制 painter

在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,int,汽车,radius,QPainter,仪表盘,绘制,painter
From: https://www.cnblogs.com/xionglaichuangyichuang/p/18285255

相关文章

  • qt 入门常用类理解(涉及QMessageBox,Layout,Spacers,Splitter,Buuddy,LoginApp,QFile,
    1.QMessageBoxQMessageBox::Yes QApplication::quit();QMessageBox::exec用于在模态(阻塞式)对话框中显示一个消息框,并等待用户的响应。这个函数通常用于在应用程序中显示消息、警告或询问对话框,并等待用户采取适当的操作后继续执行。int QMessageBox::exec()exec 函数没有......
  • 法法易为您解读新能源汽车充电枪的相关知识
     前言充电枪作为新能源汽车充电的必备设备之一,与新能源汽车的发展和充电设施的全面推广与普及息息相关,所以充电枪的好坏也在一定程度上影响着充电基础设施,可以说新能源汽车充电枪是十分重要。在电动汽车充电领域,我们常听到“充电枪”的术语。但其实许多人可能对于新能源......
  • R语言汽车口碑数据采集抓取、文本数据分词和词云可视化实现
    原文链接:https://tecdat.cn/?p=34469原文出处:拓端数据部落公众号本文以R语言为工具,帮助客户对汽车网站的口碑数据进行抓取,并基于文本数据分词技术进行数据清理和统计。通过词频统计和词云可视化,对口碑中的关键词进行分析,挖掘出消费者对汽车的评价和需求,为汽车制造商和销售商提供......
  • Python基于PyQt5和卷积神经网络分类模型(ResNet50分类算法)实现生活垃圾分类系统GUI界
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景在当今社会,随着人们对环境保护意识的增强以及科技的快速发展,智能化的垃圾分类系统成为了一个热门的研究方向。结合深度学习技术,尤其是先进的图像识......
  • PyQt5入门教程:从安装到构建简单应用
    PyQt5入门教程:从安装到构建简单应用简介PyQt5是一个功能强大的Python绑定库,用于Qt应用程序框架。它允许我们使用Python语言快速开发跨平台的桌面应用程序。本教程将引导你完成PyQt5的安装、配置,并带你创建一个简单的图形用户界面(GUI)应用程序。Part1:安装PyQt5在你的开......
  • Qt Json详细介绍
    一.概念介绍JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它具有以下特点:易读性:JSON使用人类可读的文本格式表示数据,采用键值对的方式组织数据,易于阅读和编辑。轻量级:JSON数据格式较为简洁,不包含冗余信息,适合网络传输和存......
  • 【计算机毕业设计】024基于weixin小程序汽车保养系统
    ......
  • QThread::run函数的使用(涉及到QThread::run, Qthread::start,protected,virtual虚函数,o
    RobotCommuServer.h#ifndefROBOTCOMMUSERVER_H#defineROBOTCOMMUSERVER_H#include<QThread>classRobotCommuServer:publicQThread{Q_OBJECTpublic:explicitRobotCommuServer(QObject*parent=nullptr);~RobotCommuServer();void......
  • MQTT专题
    什么是MqttMQTT协议 全称是(MessageQueuingTelemetryTransport),即消息队列遥测传输协议。是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也是具有高可靠、低开......
  • 用PyQt5打造炫酷界面:深入解析pyqt5-custom-widgets
    在PyQt5中,使用自定义小部件可以为应用程序增添更多实用性和时尚感。pyqt5-custom-widgets是一个开源项目,提供了一系列有用且时尚的自定义小部件,如开关按钮、动画按钮等。本文将详细介绍pyqt5-custom-widgets的安装和使用方法。安装可以使用PIP进行安装(根据你的平台,可能是......