Qt绘图项目 - 简易表盘

发话少说,放码过来

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
   void paintEvent(QPaintEvent *event);

private:
    Ui::Widget *ui;
    QTimer *timer;
    int currentValue; //实现指针移动
    int mark = 0; // 控制指针的移动方向
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPainter>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    currentValue = 0;
    connect(timer,&QTimer::timeout,[=](){
    if(mark == 0){
      currentValue++;
      if(currentValue >= 60)
          mark = 1;
    }
    else if(mark ==1){
        currentValue--;
        if(currentValue <= 0)
            mark = 0;
    }


    update(); // 触发绘图事件
    });
   timer->start(30);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHints(QPainter::Antialiasing,true);
    //设置黑色的背景色
    painter.setBrush(Qt::black); // 设置 黑色的画刷
    painter.drawRect(rect());

    //坐标系,平移到中心
    painter.translate(rect().center());
    //设置渐变色
//    QRadialGradient radialGradient(0,0,height()/2);//渐变圆心,渐变半径
//    radialGradient.setColorAt(0.1,QColor(255,0,0,80));
//    radialGradient.setColorAt(1,QColor(255,0,0,250));
//    // 使用这个渐变色创建画刷
//    painter.setBrush(QBrush(radialGradient));
//    //画出渐变的(椭)圆  -- 大圆
//    painter.setBrush(Qt::NoBrush); // 丢弃渐变画刷
    painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

    //画小圆
    painter.setPen(QPen(Qt::white,3)); //设置白色的画笔
    painter.drawEllipse(QPoint(0,0),60,60);

    //显示当前值:
    painter.setFont(QFont("华文宋体",20));
    painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));

    //保存原点:
    painter.save(); // 三点钟方向

    //画刻度:

    //1.算出一个刻度需要的角度 270 度分成 50份
    double angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(150); // 从135度开始
    //设置字体样式:
    painter.setFont(QFont("华文宋体",13));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有51跟刻度线
        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出长刻度上的数字标度
            if(150+angle*i < 240){ // 表盘左边数据翻转显示
            painter.rotate(180);
            painter.drawText(-(height()/2-20-10),8,QString::number(i*4));
            painter.rotate(-180);
            }
            else{//右边数据正常显示
            painter.drawText(height()/2-20-45,8,QString::number(i*4));
            }
            //画出一个长刻度
            painter.drawLine(height()/2-20,0,height()/2-3,0);

        }
        else{
            //画出一个长刻度
            painter.drawLine(height()/2-10,0,height()/2-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }

    //画指针 --> 线
    //先恢复到之前保存的原点:
    painter.restore();
    painter.save(); // 接着保存原点
    // 通过定时器去改变currentValue的值,去控制指针的移动
    painter.rotate(150+angle*currentValue); // 进行坐标系偏移
    painter.drawLine(60,0,height()/2-20-38,0); // 58

    //画扇形
    painter.restore();
    QRect rentangle(-height()/2,-height()/2,height(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-150)*16,-angle*currentValue*16);

}

效果演示

详细说明

画图准备- 背景

    QPainter painter(this);
    //设置抗锯齿
    painter.setRenderHints(QPainter::Antialiasing,true);
    //设置黑色的背景色
    painter.setBrush(Qt::black); // 设置 黑色的画刷
    painter.drawRect(rect());

坐标系平移

平移原点

    //坐标系,平移到中心
    painter.translate(rect().center());

平移坐标系弧度

    //2.设置起始角度
    painter.rotate(150); // 从135度开始

画大圆(渐变色)

   //设置渐变色
//    QRadialGradient radialGradient(0,0,height()/2);//渐变圆心,渐变半径
//    radialGradient.setColorAt(0.1,QColor(255,0,0,80));
//    radialGradient.setColorAt(1,QColor(255,0,0,250));
//    // 使用这个渐变色创建画刷
//    painter.setBrush(QBrush(radialGradient));
//    //画出渐变的(椭)圆  -- 大圆
//    painter.setBrush(Qt::NoBrush); // 丢弃渐变画刷
    painter.drawEllipse(QPoint(0,0),height()/2,height()/2);

画小圆

    //画小圆
    painter.setPen(QPen(Qt::white,3)); //设置白色的画笔
    painter.drawEllipse(QPoint(0,0),60,60);

原点保存和恢复

  
    painter.save(); //保存原点: 三点钟方向

       /* 中间经历了某种平移

   painter.rotate(150); // 从135度开始

      */

     painter.restore(); //恢复到之前保存的位置

画刻度

    //1.算出一个刻度需要的角度 270 度分成 50份
    double angle = 240*1.0/60; //需要先转为double类型,否则销售几乎部分会被吞掉造成误差
    //2.设置起始角度
    painter.rotate(150); // 从135度开始
    //设置字体样式:
    painter.setFont(QFont("华文宋体",13));
    //3.分类讨论 画出所有刻度
    for(int i=0;i<=60;++i){//包括0-  一共有61根刻度线
        if(i%5 == 0){ // 被5 整除进一步细分表盘
            //画出长刻度上的数字标度
            if(150+angle*i < 240){ // 表盘左边数据翻转显示
            painter.rotate(180);
            painter.drawText(-(height()/2-20-10),8,QString::number(i*4));
            painter.rotate(-180);
            }
            else{//右边数据正常显示
            painter.drawText(height()/2-20-45,8,QString::number(i*4));
            }
            //画出一个长刻度
            painter.drawLine(height()/2-20,0,height()/2-3,0);

        }
        else{
            //画出一个长刻度
            painter.drawLine(height()/2-10,0,height()/2-3,0);
        }
        painter.rotate(angle);//选择angle的角度准备去画下一个刻度
    }

画扇形

    //画扇形
    painter.restore();
    QRect rentangle(-height()/2,-height()/2,height(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-150)*16,-angle*currentValue*16);

定时器实现指针/扇形移动

构造函数里初始化定时器

timer = new QTimer(this);
    currentValue = 0;
    connect(timer,&QTimer::timeout,[=](){
    if(mark == 0){
      currentValue++;
      if(currentValue >= 60)
          mark = 1;
    }
    else if(mark ==1){
        currentValue--;
        if(currentValue <= 0)
            mark = 0;
    }


    update(); // 触发绘图事件
    });
   timer->start(30);


扇形移动

   // 通过定时器去改变currentValue的值,去控制指针的移动
    painter.rotate(150+angle*currentValue); // 进行坐标系偏移
    painter.drawLine(60,0,height()/2-20-38,0); // 58

    //画扇形
    painter.restore();
    QRect rentangle(-height()/2,-height()/2,height(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255,128,64,150));

    painter.drawPie(rentangle,(-150)*16,-angle*currentValue*16);

表盘中间显示 "速度"字样

    //显示当前值:
    painter.setFont(QFont("华文宋体",20));
    painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

lammps聚合物断键拉伸模拟

本文介绍聚合物的断键拉伸。 在lammps模拟中&#xff0c;所有的键默认是永久存在的&#xff0c;非正常情况下&#xff0c;不能断开&#xff0c;否则会产生"bond atoms missing”错误。 聚合物的拉伸模拟过程中&#xff0c;聚合物链并没有被拉断&#xff0c;而只是把不同的…

探索Vue.js中的文件夹上传解决方案:vue-simple-uploader

在现代Web应用开发中&#xff0c;文件上传是一个常见需求。然而&#xff0c;随着应用复杂性的增加&#xff0c;传统的文件上传方式可能无法满足所有需求&#xff0c;特别是当涉及到文件夹上传和大文件处理时。本文将介绍一个基于Vue.js的解决方案——vue-simple-uploader&#…

小程序使用接口wx.getLocation配置

开通时需详细描述业务&#xff0c;否则可能审核不通过 可能需要绑定腾讯位置服务&#xff0c;新建应该&#xff0c;绑定到小程序 配置 权限声明&#xff1a;在使用wx.getLocation前&#xff0c;需要在app.json的permission字段中声明对用户位置信息的使用权限&#xff0c;并提…

Unity基础(一)unity的下载与安装

目录 一:下载与安装 1.官网下载地址 2.推荐直接下载UnityHub 3.选择编辑器版本(推荐长期支持版) 4.在UnityHub安装选择相应的模块 二:创建项目 简介: Unity 是一款广泛应用的跨平台游戏开发引擎。 它具有以下显著特点&#xff1a; 强大的跨平台能力&#xff1a;能将开发的游…

Linux系统安装ODBC驱动,统信服务器E版安装psqlodbc方法

应用场景 硬件/整机信息&#xff1a;AMD平台 OS版本信息&#xff1a;服务器e版 软件信息&#xff1a;psqlodbc 12.02版本 功能介绍 部分用户在使用etl工具连接数据库时&#xff0c;需要使用到odbc驱动&#xff0c;下面介绍下服务器e版系统中编译安装此工具的相关过程。 E…

借助大语言模型快速学习金仓数据库 KES

基础概念 KES 人大金仓数据库管理系统 KingbaseES&#xff08;KES&#xff09; 是由 北京人大金仓信息技术股份有限公司 (以下简称“人大金仓”)自主研发的面向全行业、全客户关键应用的企业级大型通用数据库管理系统。产品融合了人大金仓在数据库领域几十年的产品研发和企业级…

XML文件

1.XMl&#xff08;EXtensible Markup Language 可扩展标记语言&#xff09; 本质是一种数据的格式,可以用来存储复杂的数据结构&#xff0c;和数据关系 2.XML的特点 XMl中的“<标签名>”称为一个标签或一个元素,一般是成对出现XML中的标签名可以自己定义,但必须要正确…

WINUI——Trigger(触发器)使用小结

背景 WINUI不提供原生的Trigger支持&#xff0c;推荐使用VisualStateManager进行操作&#xff1b;然对于从WPF转WINUI的开发人员而言&#xff0c;经常会想用Trigger解决问题&#xff0c;鉴于此社区推出了CommunityToolkit.WinUI.Triggers以支持Trigger的使用。 使用方法 1.项…

JS实现文字溢出隐藏效果

需求场景 由于项目原因&#xff0c;经常需要使用到canvas来将dom生成为图片供用户保存&#xff0c;但canvas的css属性&#xff08;例如本文实现的文字溢出隐藏效果&#xff09;支持并不全面&#xff0c;所有有些功能只能用JS来实现了 实现思路 用JS循环判断填充文本后的元素…

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…

基于MATLAB仿真的BCC卷积码维特比译码算法

&#x1f9d1;&#x1f3fb;个人简介&#xff1a;具有3年工作经验&#xff0c;擅长通信算法的MATLAB仿真和FPGA实现。代码事宜&#xff0c;私信博主&#xff0c;程序定制、设计指导。 &#x1f680;基于MATLAB仿真的BCC卷积码维特比译码算法 目录 &#x1f680;1.BCC卷积码概…

WebGIS开发:你还在纠结的10大问题合集!

问题1&#xff1a;GIS开发到底是学Java还是Python&#xff1f; Java是后端语言&#xff0c;Python更重数据分析和算法。 假设通常说的GIS开发是指Webgis&#xff0c;Web就是指网页端&#xff0c;所以我们说的GIS开发大部分情况下是指网页端的地图可视化开发。 GIS开发需要学…

AI预测福彩3D采取888=3策略+和值012路或胆码测试6月13日新模型预测第3弹

今天咱们继续验证新模型的8码定位3&#xff0c;目前新模型新算法已连续命中2次。咱们重点是预测8码定位3&#xff0b;和值012胆码。有些朋友看到我最近两篇文章没有给大家提供缩水后的预测详情&#xff0c;在这里解释下&#xff1a;其实我每篇文章中既有8码定位&#xff0c;也有…

113个大自然声音助眠纯音乐白噪音数据包

今天这一个数据包内置很多简单好听助眠纯音乐歌曲素材&#xff0c;可以帮助用户更好进行大自然声音聆听&#xff0c;带来更多简单舒适睡眠纯音乐环境&#xff0c;享受更多独特音乐听曲放松方式&#xff0c;帮助用户更好听歌助眠&#xff0c;获取更多好的睡眠环境以及质量&#…

​揭秘Grok大模型:未来AI的无限可能

&#x1f680; 大家好&#xff0c;今天我们要带大家走进一个充满未来科技感的世界&#xff0c;探秘一款备受瞩目的大模型——Grok&#xff01; 一、Grok背后的神秘力量 Grok&#xff0c;这个名字可能对于大多数人来说还是陌生的&#xff0c;但它背后的公司——xAI&#xff0c…

总脱发,白发多,解决“头等”大事,可以试试这个~

谁懂啊&#xff01;想当年发量傲人&#xff0c;如今却成了人间蒲公英。头发走哪掉哪&#xff0c;光1天掉的头发&#xff0c;收集起来都够编个辫子了。 更扎心的&#xff0c;是去理发时 Tony 不再问「打薄吗」&#xff0c;而是小心翼翼地提醒&#xff1a;「咱可以烫一下&#xf…

【NLP】给Transformer降降秩,通过分层选择性降阶提高语言模型的推理能力

【NLP】给Transformer降降秩&#xff0c;通过分层选择性降阶提高语言模型的推理能力 文章目录 【自然语言处理-论文翻译与学习】序1、导论2、相关工作3、相关工具4、方案5、实验5.1 使用 GPT-J 对 CounterFact 数据集进行彻底分析5.1.1 数据集中的哪些事实是通过降阶恢复的&…

MYSQL基础_12_MySQL数据类型精讲

第12章_MySQL数据类型精讲 1. MySQL中的数据类型 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TE…

红黑树(C++)

文章目录 写在前面1. 红黑树的概念及性质1. 1 红黑树的概念1. 2 红黑树的性质 2. 红黑树节点的定义3. 红黑树的插入3.1 按照二叉搜索的树规则插入新节点3.2 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏 4.红黑树的删除5.红黑树的验证6.源码 写在前面 在上篇文章中&…

10KM无人机高清图传通信模组,低延迟、抗干扰,飞睿智能无线MESH组网模块

随着科技的飞速发展&#xff0c;无人机技术在各个领域的应用越来越广泛。尤其在海上监测、搜索救援、货物运输等场景中&#xff0c;无人机的应用显得尤为重要。然而&#xff0c;要实现无人机在复杂海域环境中的高效通信&#xff0c;高清图传通信模组的作用不可忽视。本文将深入…