Qt绘图项目 - 简易表盘

news2024/10/6 16:23:30

发话少说,放码过来

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3-哈希表-81-四数之和-LeetCode18

3-哈希表-81-四数之和-LeetCode18 参考&#xff1a;代码随想录 LeetCode: 题目序号18 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff…

C#发送邮件

C#发送邮件代码&#xff0c;亲测可用。 using System; using System.Net; using System.Net.Mail;namespace MailSend {class Program{static void Main(string[] args){try{MailAddress receiver new MailAddress("666666666qq.com");//666666666qq.com 换成收件人…

告别混乱!7步打造精益管理模式,让企业效率翻倍

当下&#xff0c;企业要想立于不败之地&#xff0c;就必须注重管理效率的提升。然而&#xff0c;很多企业在追求高效运营的过程中&#xff0c;却常常陷入混乱和无效的努力中。那么&#xff0c;如何才能真正实现精益管理呢&#xff1f;深圳天行健精益管理咨询公司分享步骤如下&a…

【投稿优惠】2024年计算机科学与软件工程国际会议(ICCSSE 2024)

2024年计算机科学与软件工程国际会议 2024 International Conference on Computer Science and Software Engineering 会议简介 2024年计算机科学与软件工程国际会议是一个备受全球瞩目的学术盛会&#xff0c;旨在促进计算机科学和软件工程领域的学术交流与合作。此次会议将汇聚…

Android开发之音乐播放器添加排行需求

Music统计功能需求 1.记录歌曲名称与次数(歌曲播放结束算一次)&#xff0c;根据播放次数制作一个排行列表;&#xff08;开始说要记录歌手&#xff0c;后面debug发现这个字段没有&#xff0c;暂时不记录&#xff09; 2.记录播放歌曲的时长&#xff0c;时间累加&#xff1b;&…

基于安信可串口调试助手软件调试ESP8266串口WIFI模块ESP-01S应用功能

基于安信可串口调试助手软件调试ESP8266串口WIFI模块ESP-01S应用功能 ESP8266_01S引脚功能图ESP8266_01S原理图ESP8266_01S尺寸图检验工作1、USB-TTL串口工具(推荐使用搭载CP2102芯片的安信可USB-T1串口)与ESP8266_01S WiFi模块(推荐使用安信可ESP8266系列模组)接线(注意当…

使用谷歌 Gemini API 构建自己的 ChatGPT(一)

AI领域一直由OpenAI和微软等公司主导&#xff0c;而Gemini则崭露头角&#xff0c;以更大的规模和多样性脱颖而出。它被设计用于无缝处理文本、图像、音频和视频&#xff1b;这些基础模型重新定义了人工智能交互的边界。随着谷歌在人工智能领域强势回归&#xff0c;了解Gemini如…

HMI(人机交互)应用的15大领域,欢迎补充。

HMI&#xff08;Human-Machine Interface&#xff0c;人机界面&#xff09;可以应用于许多不同的场景和行业&#xff0c;包括但不限于以下几个方面&#xff1a; 工业控制系统&#xff1a;HMI在工业生产中广泛应用&#xff0c;用于监控和控制生产过程。例如&#xff0c;工厂中的…

数据库学霸笔记

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

前端问题整理

Vue vue mvvm&#xff08;Model-View-ViewModel&#xff09;架构模式原理 Model 是数据层&#xff0c;即 vue 实例中的数据View 是视图层&#xff0c; 即 domViewModel&#xff0c;即连接Model和Vue的中间层&#xff0c;Vue实例就是ViewModelViewModel 负责将 Model 的变化反映…

构建企业核心竞争力:拥有自主大模型,引领行业未来

前言 随着人工智能技术的飞速发展&#xff0c;大模型技术已经成为推动行业进步的重要力量。在这个变革的时代&#xff0c;作为一位具有前瞻性的企业家&#xff0c;您深知拥有自主大模型对于提升公司竞争力、引领行业未来的重要性。本文将为您详细介绍大模型的市场现状以及企业…

【机器学习】通用大模型VS垂直大模型,你更加青睐哪一方?

目录 前言AI大模型的战场&#xff1a;通用与垂直的分化通用大模型&#xff1a;广泛适用的利器垂直大模型&#xff1a;深入领域的利器谁能够形成绝对优势&#xff1f;结语通用大模型文章推荐 前言 AI大模型的战场正在分化&#xff1a; 通用大模型在落地场景更广泛毋庸置疑&…

暗色系B端界面有什么好处、应用场景、缺点、该如何设计。

B端管理系统界面蓝色系和浅色系的非常多&#xff0c;暗色系一般不作为首选&#xff0c;这背后是什么原因呢&#xff0c;如果真的要设计暗色系界面&#xff0c;该如何办呢&#xff0c;本文就解决这些问题。 一、暗色系B端界面相对于浅色系有什么好处 1. 减少眩光和视觉疲劳&am…

引入tinyMCE富文本框在vue3中的使用

实现效果&#xff1a; 官网地址&#xff1a;TinyMCE 7 Documentation | TinyMCE Documentation 1.下载依赖&#xff08;我使用的版本是5.0 目前最新版本到7了&#xff09; pnpm/npm install tinymce5.0.0 -S pnpm/npm install tinymce/tinymce-vue -S 2.在public文件夹下…

浅析Spring中Async注解底层异步线程池原理

一、前言 开发中我们经常会用到异步方法调用&#xff0c;具体到代码层面&#xff0c;异步方法调用的实现方式有很多种&#xff0c;比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程&#xff0c;然后启动异步线程&#xff1b;再如&#xff0c;可以直接用java.uti…

数字孪生技术如何赋能智慧工厂

数字孪生技术为什么能在智慧工厂中发挥作用&#xff1f;随着工业4.0的推进和智能制造的普及&#xff0c;数字孪生技术成为智慧工厂的重要推动力。数字孪生是指在虚拟空间中创建一个与现实物理实体相对应的数字模型&#xff0c;通过实时数据交互和分析&#xff0c;实现对物理实体…

即插即用!CVD:第一个生成具有相机控制的多视图一致视频方案!(斯坦福港中文)

论文链接&#xff1a;https://arxiv.org/abs/2405.17414 项目链接&#xff1a;https://collaborativevideodiffusion.github.io/ 最近对视频生成的研究取得了巨大进展&#xff0c;使得可以从文本提示或图像生成高质量的视频。在视频生成过程中添加控制是未来的重要目标&#x…

GIS大赛制图类训练营:从入门到直通决赛,你只差这一步!

为什么要参加GIS大赛&#xff1f; 相信只要是读GIS相关专业的同学&#xff0c;大家在学校应该会经常被老师要求学生参加比赛&#xff0c;往届的学长学姐们也会鼓励大家本科期间多参加GIS大赛。 那是因为参加GIS比赛的好处多多&#xff0c;报名参赛不仅可以提升自身动手能力&…

多校园跑腿小程序源码系统 帮取+代拿+外卖配送 功能超多 带完整的安装代码包+搭建部署教程

系统概述 多校园跑腿小程序源码系统 是一款基于微信小程序平台开发的全功能校园服务应用。该系统采用先进的前后端分离架构&#xff0c;结合云服务技术&#xff0c;确保了系统的高可用性、可扩展性和安全性。系统设计之初就充分考虑到了多校园环境的特殊性&#xff0c;支持多校…

基于flask的网站如何使用https加密通信

文章目录 内容简介网站目录示例生成SSL证书单独使用Flask使用WSGI服务器Nginx反向代理参考资料 内容简介 HTTPS 是一种至关重要的网络安全协议&#xff0c;它通过在 HTTP 协议之上添加 SSL/TLS 层来确保数据传输的安全性和完整性。这有助于防止数据在客户端和服务器之间传输时…