Qt绘图项目 - 简易表盘

废话少说,放码过来

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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.mzph.cn/news/851953.shtml

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

相关文章

LayUI使用(二)处理表格会出现下拉框的问题

一、问题描述 如下&#xff0c;layui的表格渲染后&#xff0c;当鼠标悬停在表格项时会出现右侧的下拉框&#xff0c;layui版本较老&#xff0c;原因未知 二、处理办法 在cols里面加上width&#xff0c;也不用每个都加&#xff0c;加一部分表格项即可 注意&#xff1a;若想禁止…

iOS/iPadOS18Beta是否值得升级体验?Bug汇总和升级办法分享!

苹果昨天发布了iOS/iPadOS18Beta更新&#xff0c;引入了诸多新功能/新特性&#xff0c;很多喜欢尝鲜的用户已经在第一时间进行了升级。 iOS/iPadOS18Beta目前存在不少Bug&#xff0c;建议暂时不要更新&#xff0c;轻则浪费装机时间&#xff0c;重则丢失相关数据&#xff0c;甚至…

ping: www.baidu.com: 未知的名称或服务(IP号不匹配)

我用的是VMware上的Red Hat Enterprise Linux 9&#xff0c;出现了能联网但ping不通外网的情况。 问题描述&#xff1a;设置中显示正常连接&#xff0c;而且虚拟机右上角有联网的图标&#xff0c;但不能通外网。 按照网上教程修改了/etc/resolv.conf和/etc/sysconfig/network-…

江协科技51单片机学习-1 安装Keil5开发环境

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

Flask基础2-Jinja2模板

目录 1.介绍 2.模板传参 1.变量传参 2.表达式 3.控制语句 4.过滤器 5.自定义过滤器 6.测试器 7.块和继承 flask基础1 1.介绍 Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作 者。他的设计思想来源于Django的模…

Shell脚本从入门到实战

一、概述 shell 是一个命令行解释器&#xff0c;它接受应用程序、用户命令&#xff0c;然后调用操作系统内核。 shell 还是一个功能强大编程语言&#xff0c;易调试&#xff0c;易编写&#xff0c;灵活性强。 二、mac 怎么重启docker 1.如何重启 Docker on Mac 在 macOS 上…

Python界面编辑器Tkinter布局助手 使用体验

一、发现 我今天在网上搜关于Python Tkinter方面的信息时&#xff0c;发现了Python界面编辑器 Tkinter布局助手 的使用说明。 https://blog.csdn.net/weixin_52777652/article/details/135291731?spm1001.2014.3001.5506 这个编辑器是个开源的项目&#xff0c;个人用户可以…

随手记:商品信息过多,展开收起功能

UI原型图&#xff1a; 页面思路&#xff1a; 在商品信息最小item外面有一个包裹所有item的标签&#xff0c;控制这个标签的高度来实现展开收起功能 <!-- 药品信息 --><view class"drugs" v-if"inquiryInfoSubmitBtn"><view class"…

C++ 14 之 宏函数

c14宏函数.cpp #include <iostream> using namespace std;// #define PI 3.14 // 宏函数 // 宏函数缺陷1: 必须用括号保证运算的完整性 #define MY_ADD(x,y) ((x)(y))// 宏函数缺陷2&#xff1a;即使加了括号&#xff0c;有些运算依然与预期不符 #define MY_COM(a,b) ((…

技术革新,智绘未来丨悦数图数据库 v5.0 重磅亮相 WAIC 2024

本次 WAIC&#xff08;世界人工智能大会&#xff09;2024 将于7 月 4 日- 7 日在上海世博展览馆**举行&#xff0c;本次 WAIC 2024 围绕“以共商促共享 以善治促善智”为主题&#xff0c;杭州悦数科技有限公司将携最新的悦数图数据库 v5.0 亮相 E805 展位。作为国内领先的图数据…

2024/06/13--代码随想录算法(贪心)3/6|134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列

134.加油站 力扣链接 class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:curSum 0 # 当前累计的剩余油量totalSum 0 # 总剩余油量start 0 # 起始位置for i in range(len(gas)):curSum gas[i] - cost[i]totalSum gas[i] - co…

二十三、生成帮助文档

二十一、Java工具类的创建 二十二、Jar包制作及使用 这一篇开始学习如何生成帮助文档。为什么要学习生成帮助文档&#xff1f; 1、工具类已经制作好了&#xff0c;Java工具类的创建的类是一个.java文件&#xff0c;编译后成.class文件看不懂&#xff0c;所以需要对应的帮助文档…

韩国版AlphaFold?深度学习模型AlphaPPIMd:用于蛋白质-蛋白质复合物构象集合探索

在生命的舞台上&#xff0c;蛋白质扮演着不可或缺的角色。它们是生物体中最为活跃的分子&#xff0c;参与细胞的构建、修复、能量转换、信号传递以及无数关键的生物学功能。同时&#xff0c;蛋白质的结构与其功能密切相关&#xff0c;而它们的功能又通过与蛋白质、多肽、核苷酸…

【方法】Word文档如何添加“打开密码”?

Word文档是很常用的办公文档&#xff0c;对于重要的文档&#xff0c;不想被他人随意查看&#xff0c;或者只有指定的人可以查看&#xff0c;我们可以给Word文档设置密码保护&#xff0c;这样只有知道密码的人才可以打开文档。 下面分享两种Word文档添加“打开密码”的方法&…

uniapp上传头像并裁剪图片

第一步写上uniapp自带的选择图片button按钮 点击之后会弹出选择图片的方式 拍照或从相册选择图片后将会跳到图片裁剪 然后我们裁剪完之后点击确定在上传图片 这里是上传图片的接口 拿到本地图片 上传的话自己想以那种方式上传都可以

5.0 Python 函数简介

1.函数 1.1 基本定义 定义: 将一组语句的集合通过函数进行封装, 简单来说是具有一定功能的代码容器, 想要执行这些语句, 只需要调用函数的名称即可. 特性: * 1. 可重复使用, 减少代码冗余. * 2. 组织结构清晰, 可读性增强. * 3. 可扩展性提高, 便于维护. 1.2 使用规则 函…

LabVIEW开发指针式压力仪表图像识别

系统利用LabVIEW编程实现对指针式压力仪表的读取&#xff0c;通过相机、光源、固定支架等硬件捕捉仪表图像&#xff0c;并通过图像识别技术解析压力值。系统分为两个阶段&#xff1a;第一阶段固定相机更换仪表&#xff0c;第二阶段移动相机识别多个固定仪表。本文介绍硬件选择、…

Java | Leetcode Java题解之第141题环形链表

题目&#xff1a; 题解&#xff1a; public class Solution {public boolean hasCycle(ListNode head) {if (head null || head.next null) {return false;}ListNode slow head;ListNode fast head.next;while (slow ! fast) {if (fast null || fast.next null) {return…

空气净化器是智商税吗?空气净化器哪款品牌效果最好?

随着科技的发展和人们生活水平的提高&#xff0c;空气净化器逐渐走进千家万户。然而&#xff0c;有人认为空气净化器的实际效用被夸大&#xff0c;只是商家营销的手段&#xff0c;成为了“智商税”。那么&#xff0c;空气净化器真的有用吗&#xff1f;在众多品牌中&#xff0c;…

Unity UGUI ScrollRect 滑动显示左右箭头

目录 一、前言 二、效果 三、代码解析 EnhancedScrollRect.cs 解析 Start 方法 HandleArrowVisibility 方法 EnhancedScrollRectEditor.cs 解析 OnEnable 方法 OnInspectorGUI 方法 四、完整代码 EnhancedScrollRect.cs EnhancedScrollRectEditor.cs 五、总结 De…