当前位置: 首页 > news >正文

P6 QT项目----汽车仪表盘(6.4)

6.4.1 仪表表盘完成

#include "widget.h"
#include "ui_widget.h"
 
#include <QPainter>
#include <QtMath>
#include <QRadialGradient>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timeStart(50);
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    int rad = height()/2;
    //设置画布
   initCanvas(painter);
    //画小圆
    drawMiddleCircle(painter,60);
    //画刻度
    drawScale(painter,rad);
    //画刻度文字
    drawScaleText(painter,rad);
    //画内圆的闪烁
    drawInnerCircleShine(painter,140);
    //画指标
    drawIndex(painter);
    //画扇形
    drawPie(painter,rad+25);
    //画内部黑色的圆
    drawInnerCircleBlack(painter,70);
    //画当前速度
    drawCurrentSpeed(painter);
    //画外圆闪烁
    drawOutterCircleShine(painter,rad+25);
    //画一个Logo
    drawLogo(painter,rad);
}
 
void Widget::initCanvas(QPainter &painter)
{
    //设置背景色
    painter.setBrush(QBrush(Qt::black));
    painter.drawRect(rect());
 
    //抗锯齿
    painter.setRenderHint(QPainter::Antialiasing,true);
 
    //设置中心为坐标原点,平移坐标
    QPoint rec_center(rect().width()/2,rect().height()*0.6);
    painter.translate(rec_center);
}
 
void Widget::drawMiddleCircle(QPainter &painter, int radius)
{
    //画小圆
    painter.setPen(QPen(Qt::white,3));
    painter.drawEllipse(QPoint(0,0),radius,radius);
}
 
void Widget::drawCurrentSpeed(QPainter &painter)
{
    //当前速度值
    QFont font_figure("Arial",20);
    font_figure.setBold(true);
    painter.setFont(font_figure);
    painter.setPen(QPen(Qt::white,20));
    painter.drawText(QRect(-60,-60,120,80),Qt::AlignCenter,QString::number(currentdata*4));
    //显示Km/h
    QFont font_text("Arial",10);
    font_text.setBold(true);
    painter.setFont(font_text);
    painter.setPen(QPen(Qt::white,10));
    painter.drawText(QRect(-60,-60,120,170),Qt::AlignCenter,"Km/h");
}
 
void Widget::drawScale(QPainter &painter, int radius)
{
    //画刻度
    painter.save();             //保存当前坐标位置,x在3点钟方向
    painter.rotate(initial_angle);        //表盘起始位置
    painter.setPen(QPen(Qt::white,5));
    //算出一个刻度所需要的角度
    rotation_angle = 240 * 1.0/ 60;  //240*1.0的作用是扩大变量类型,把int型阔成double,保留小数
    for (int i = 0; i <= 60; i++) {
        //大于160的刻度线标红
        if(i >= 40){
            painter.setPen(QPen(Qt::red,5));
        }
        if(i % 5 == 0){
            //画长刻度线
            painter.drawLine(radius-23,0,height()/2-2,0);
        }
        else {
            //画短刻度线
            painter.drawLine(radius-8,0,height()/2-2,0);
        }
        //画完后旋转,改变坐标轴方向
        painter.rotate(rotation_angle);
    }
    painter.restore();      //恢复坐标位置,x在3点钟方向
    painter.setPen(QPen(Qt::white,5));
}
 
void Widget::drawScaleText(QPainter &painter, int radius)
{
    //写刻度文字
    QFont font("Arial",10);
    font.setBold(true);
    painter.setFont(font);
    int r = radius-50;
    for (int i = 0; i <= 60; i++) {
        if(i % 5 == 0){
            //保存坐标系
            painter.save();
            //算出平移点
            int deltX = qCos(qDegreesToRadians(210 - rotation_angle*i)) * r;            //QT的正弦,余弦函数认的是弧度
            int deltY = qSin(qDegreesToRadians(210 - rotation_angle*i)) * r;
            //平移坐标系
            painter.translate(QPoint(deltX,-deltY));
            //旋转坐标系
            painter.rotate(-120 + rotation_angle*i);
            //写刻度数字
            painter.drawText(QRect(-25,-25,50,30),Qt::AlignCenter,QString::number(i*4));
            //恢复坐标系
            painter.restore();
        }
    }
}
 
void Widget::drawIndex(QPainter &painter)
{
    //画指标
    painter.save();
 
    static const QPointF points[4] = {
         QPointF(0, -10.0),
         QPointF(220.0, -1),
         QPointF(220.0, 1),
         QPointF(0,0)
     };
 
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(Qt::white));
    painter.rotate(initial_angle + currentdata*rotation_angle);
    painter.drawPolygon(points, 4);
}
 
void Widget::drawPie(QPainter &painter, int radius)
{
    //画扇形
    //坐标轴回到原来位置(0,0)
    painter.restore();
    //去边框
    painter.setPen(Qt::NoPen);
    //背景色
    painter.setBrush(QColor(222,164,121,100));
    //确认矩形,扇形长度与指标相同
    QRect rectangle(-radius,-radius,radius*2,radius*2);
    painter.drawPie(rectangle,-(initial_angle*16),-(rotation_angle*currentdata*16));
}
 
void Widget::timeStart(int ms)
{
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,[=](){
        if(flag == 0){
            currentdata++;
            if(currentdata >= 60){
                flag = 1;
            }
        }
        else {
            currentdata--;
            if(currentdata == 0){
                flag = 0;
            }
        }
        update();
    });
    timer->start(ms);
}
 
void Widget::drawInnerCircleShine(QPainter &painter, int radius)
{
    //内圆渐变色彩,径向渐变
    painter.setPen(Qt::NoPen);
    QRadialGradient radialGradient(QPoint(0,0),radius);
    radialGradient.setColorAt(0,QColor(255,0,0,200));
    radialGradient.setColorAt(1,QColor(0,0,0,100));
    painter.setBrush(QBrush(radialGradient));
    painter.drawEllipse(QPoint(0,0),radius,radius);
}
 
void Widget::drawInnerCircleBlack(QPainter &painter, int radius)
{
    //画出黑色的圆
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(Qt::black));
    painter.drawEllipse(QPoint(0,0),radius,radius);
}
 
void Widget::drawOutterCircleShine(QPainter &painter, int radius)
{
    //外圆渐变色彩,径向渐变
    painter.setPen(Qt::NoPen);
    QRadialGradient radialGradient(QPoint(0,0),radius);
    radialGradient.setColorAt(0,QColor(0,0,0,0));
    radialGradient.setColorAt(0.8,QColor(255,0,0,0));
    radialGradient.setColorAt(0.9,QColor(255,0,0,50));
    radialGradient.setColorAt(1,QColor(255,0,0,150));
    painter.setBrush(QBrush(radialGradient));
    QRect rectangle(-radius,-radius,radius*2,radius*2);
    painter.drawPie(rectangle,-(initial_angle*16),-(rotation_angle*60*16));
}
 
void Widget::drawLogo(QPainter &painter, int radius)
{
    QRect rectangle(-150,radius*0.5,300,100);
    painter.drawPixmap(rectangle,QPixmap(":/icon.jpg"));
}

相关文章:

  • C++ vector深度剖析与模拟实现:探索模板的泛型应用
  • 腾讯云国际站缩容:策略、考量与实践
  • 智慧园区建设资料合集(Wordppt原件)
  • Spring Boot 中的条件装配:@Conditional 系列注解详解
  • 答辩讲解387基于Spring Boot的心理健康管理系统
  • 【Python系列PyCharm实战】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解决方案大全
  • Windows Server系统只有命令行不显示桌面的解决方法
  • 【超详细】讯飞智能车PC电脑烧录指南(高级系统部署与恢复)
  • LDPC码校验矩阵和生成矩阵的生成
  • Java在IDEA中终端窗口输出正常,但打包成JAR后中文乱码问题
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 实战基于CSI2 Rx 构建高性能摄像头输入系统
  • 51c嵌入式~电路~合集2
  • 【沉浸式解决问题】优化MySQL中多表union速度慢的问题
  • 数字化零售如何全面优化顾客体验
  • 深度融合数智化,百胜软件联合华为云加速零售行业转型升级
  • 删除大表数据注意事项
  • 字符操作函数续上
  • Vue 实现图片裁剪功能:基于 vue-cropper 和 Element Plus 的完整解决方案
  • AI Agent学习 -- (2)LangChain的安装
  • 全面探索 KingbaseES 在线数据库平台:从开发到优化的全方位体验
  • 邯郸网站建设推广/seo关键词分析表
  • 番茄wordpress/seo 网站推广
  • 温州做网站/万网域名查询注册商
  • 长沙城乡建设网站首页/google play三件套
  • 产品经理兼职做网站报酬/自己如何做链接推广
  • 苏州高端网站制作/138ip查询网域名解析