QPaint绘制自定义仪表盘组件03

网上视频抄的,用来自己看一下,看完就删掉

ui

 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QDebug>
#include <QtMath>
#include <QDialog>
#include <QPainter>
#include <QPaintEvent>
#include <QPainterPath>
#include <QRadialGradient>#include <QTimer>
#include <QKeyEvent>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QTimer *myTimer;int radius;//仪表盘的中心位置int direction;//指针运动的方向,1为前进,0为后退protected:void paintEvent(QPaintEvent*);
private:int degRotate =0;private:void DrawPoint(QPainter&,int);void DrawDigital(QPainter&,int);void DrawCircle(QPainter&,int);void DrawSmallScale(QPainter&,int);void DrawBigScale(QPainter&,int);void DrawUnit(QPainter&,int);void DrawNum(QPainter&,int);void DrawPointer(QPainter&,int);void drawIndicator(QPainter *painter);void DrawCircle_line(QPainter& painter,int radius);void DrawCircle_bom(QPainter& painter,int radius);void DrawCircle_bom_big(QPainter& painter,int radius);void DrawCircle_bom_shine(QPainter& painter,int radius);void DrawCircle_bom_small(QPainter& painter,int radius);void DrawCircle_arc(QPainter& painter,int radius);void keyPressEvent(QKeyEvent *event);void keyReleaseEvent(QKeyEvent *event);private slots:void slot_speed_changed();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// setFixedSize() 函数是 QWidget 类的一个成员函数,用于设置窗口的固定大小。// 该函数接受两个参数,分别是窗口宽度和高度。// 设置后无法通过拖拽窗口的边缘来改变窗口大小,而且,即使添加的控件超出了窗口大小,也不会出现滚动条。setFixedSize(1280,800);//定时器动态增加时速myTimer = new QTimer(this);connect(myTimer,SIGNAL(timeout()),this,SLOT(slot_speed_changed()));}void MainWindow::paintEvent(QPaintEvent*)
{QPainter painter(this);int width=this->width();int height=this->height() - 100;//移动仪表盘的高度int radius=((width>height)?height:width)/2.0;//仪表盘的中心位置//移动画笔到中下方painter.translate(width/2,height*0.6);//启用反锯齿painter.setRenderHint(QPainter::Antialiasing, true);painter.setPen(Qt::NoPen);//设置画刷颜色painter.setBrush(QColor(138,43,226));DrawSmallScale(painter,radius-60);//刻度线DrawDigital(painter,radius-90);//刻度数字/*所有形状绘画*/// DrawCircle_bom(painter,radius-40);  //扇形大圆DrawCircle(painter,radius-35);      //渐变发光外扇形DrawCircle_arc(painter,radius - 40);//动态扇形环DrawPointer(painter,radius-130);//指针DrawCircle_line(painter,radius-35); //最外细圆线DrawCircle_bom_big(painter,radius-150);//中间大圆DrawCircle_bom_shine(painter,radius - 230);//渐变发光内圈DrawCircle_bom_small(painter,radius - 200);//中间小圆DrawUnit(painter,radius - 390);//单位DrawNum(painter,radius-300);//时速
}
//绘制外圈点
void MainWindow::DrawPoint(QPainter& painter,int radius)
{//组装点的路径图QPainterPath pointPath;pointPath.moveTo(-2,-2);pointPath.lineTo(2,-2);pointPath.lineTo(2,2);pointPath.lineTo(0,4);pointPath.lineTo(-2,2);//绘制13个小点for(int i=0;i<13;++i){QPointF point(0,0);painter.save();painter.setBrush(QColor(250,252,78));//计算并移动绘图对象中心点point.setX(radius*qCos(((210-i*20)*M_PI)/180));point.setY(radius*qSin(((210-i*20)*M_PI)/180));//计算并移动绘图对象的中心点painter.translate(point.x(),-point.y());//计算并选择绘图对象坐标painter.rotate(-120+i*20);//绘制路径painter.drawPath(pointPath);painter.restore();}
}//刻度数字
void MainWindow::DrawDigital(QPainter& painter,int radius)
{//设置画笔,画笔默认NOPENpainter.setPen(QColor(255,255,255));QFont font;font.setFamily("Arial");font.setPointSize(15);font.setBold(true);painter.setFont(font);for(int i=0;i<13;++i){QPointF point(0,0);painter.save();point.setX(radius*qCos(((210-i*20)*M_PI)/180));point.setY(radius*qSin(((210-i*20)*M_PI)/180));painter.translate(point.x(),-point.y());painter.rotate(-120+i*20);painter.drawText(-25, 0, 50, 20,Qt::AlignCenter,QString::number(i*20));painter.restore();}//还原画笔painter.setPen(Qt::NoPen);
}//扇形大圆
void MainWindow::DrawCircle_bom(QPainter& painter,int radius)
{//保存绘图对象painter.save();//计算大小圆路径QPainterPath outRing;outRing.moveTo(0,0);outRing.arcTo(-radius,-radius, 2*radius,2*radius,-30,240);outRing.closeSubpath();//设置画刷painter.setBrush(QColor(14,15,33));painter.drawPath(outRing);painter.restore();
}//渐变发光内圈
void  MainWindow::DrawCircle_bom_shine(QPainter& painter,int radius)
{painter.save();QRadialGradient radialGradient(0,0,radius,0,0);
//    radialGradient.setColorAt(0.5,QColor(8,77,197));radialGradient.setColorAt(0.5,QColor(10,68,185,150));radialGradient.setColorAt(1.0,Qt::transparent);painter.setBrush(QBrush(radialGradient));painter.drawRect(-radius,-radius,2*(radius),2*(radius));painter.restore();}//中间大圆
void  MainWindow::DrawCircle_bom_big(QPainter& painter,int radius)
{//保存绘图对象painter.save();//计算大小圆路径QPainterPath inRing;inRing.moveTo(0,0);inRing.addEllipse(-radius+50,-radius + 50,2*(radius-50),2*(radius-50));//设置画刷painter.setBrush(QColor(10,20,30));painter.drawPath(inRing);painter.restore();
}void  MainWindow::DrawCircle_bom_small(QPainter& painter,int radius)
{//保存绘图对象painter.save();//计算大小圆路径QPainterPath inRing;inRing.moveTo(0,0);inRing.addEllipse(-radius+50,-radius + 50,2*(radius-50),2*(radius-50));//设置画刷painter.setBrush(QColor(10,20,30));painter.drawPath(inRing);painter.restore();
}void MainWindow::DrawCircle_arc(QPainter& painter,int radius)
{QRect rect(-radius,-radius,2*radius,2*radius);QConicalGradient Conical(0,0,-70);Conical.setColorAt(0.1,QColor(255,88,127,200));//红色Conical.setColorAt(0.5,QColor(53,179,251,150));//蓝色painter.setBrush(Conical);painter.drawPie(rect,210*16,-(degRotate)*16);
}//渐变发光外扇形
void MainWindow::DrawCircle(QPainter& painter,int radius)
{//保存绘图对象painter.save();//计算大小圆路径QPainterPath outRing;QPainterPath inRing;outRing.moveTo(0,0);inRing.moveTo(0,0);outRing.arcTo(-radius,-radius, 2*radius,2*radius,-30,240);inRing.addEllipse(-radius+50,-radius + 50,2*(radius-50),2*(radius-50));outRing.closeSubpath();//设置渐变色kQRadialGradient radialGradient(0,0,radius,0,0);radialGradient.setColorAt(1,QColor(0,82,199));radialGradient.setColorAt(0.92,Qt::transparent);//设置画刷painter.setBrush(radialGradient);//大圆减小圆painter.drawPath(outRing.subtracted(inRing));painter.restore();
}//最外细圆线
void MainWindow::DrawCircle_line(QPainter& painter,int radius)
{//保存绘图对象painter.save();//计算大小圆路径QPainterPath outRing;QPainterPath inRing;outRing.moveTo(0,0);inRing.moveTo(0,0);outRing.arcTo(-radius,-radius, 2*radius,2*radius,-30,240);inRing.addEllipse(-radius+2,-radius+2,2*(radius-2),2*(radius-2));outRing.closeSubpath();//设置画刷painter.setBrush(QColor(5,228,255));//大圆减小圆painter.drawPath(outRing.subtracted(inRing));painter.restore();
}//绘制刻度
void MainWindow::DrawSmallScale(QPainter& painter,int radius)
{//组装点的路径图QPainterPath pointPath_small;pointPath_small.moveTo(-2,-2);pointPath_small.lineTo(2,-2);pointPath_small.lineTo(2,8);pointPath_small.lineTo(-2,8);QPainterPath pointPath_big;pointPath_big.moveTo(-2,-2);pointPath_big.lineTo(2,-2);pointPath_big.lineTo(2,20);pointPath_big.lineTo(-2,20);//绘制121个小点for(int i=0;i<121;i+=2){QPointF point(0,0);painter.save();point.setX(radius*qCos(((210-i*2)*M_PI)/180));point.setY(radius*qSin(((210-i*2)*M_PI)/180));painter.translate(point.x(),-point.y());painter.rotate(-120+i*2);if(i<80){painter.setBrush(QColor(255,255,255));}if(i>=80){painter.setBrush(QColor(235,70,70));}if(i%5 == 0){painter.drawPath(pointPath_big);//绘画大刻度}else{painter.drawPath(pointPath_small);//绘画小刻度}painter.restore();}
}//绘制文字
void MainWindow::DrawUnit(QPainter& painter,int radius)
{painter.save();painter.setPen(QColor(255,255,255));QFont font;font.setFamily("Arial");font.setPointSize(16);font.setBold(true);painter.setFont(font);painter.drawText(-50, -radius, 100, 20,Qt::AlignCenter,QString("km/h"));painter.drawText(-60, -radius + 130, 120, 40,Qt::AlignCenter,QString("当前车速"));painter.setPen(QColor(255,255,255,50));painter.drawText(-120, -radius + 280, 250, 40,Qt::AlignCenter,QString("-请按space键加速-"));painter.restore();
}//绘制实时时速数字
void MainWindow::DrawNum(QPainter& painter,int radius)
{painter.save();painter.setPen(QColor(255,255,255));QFont font;font.setFamily("Arial");font.setPointSize(45);painter.setFont(font);painter.drawText(-75, -radius - 20, 150, 100,Qt::AlignCenter,QString::number(degRotate));painter.restore();
}//绘制指针
void MainWindow::DrawPointer(QPainter& painter,int radius)
{//组装点的路径图QPainterPath pointPath;pointPath.moveTo(10,0);pointPath.lineTo(1,-radius);pointPath.lineTo(-1,-radius);pointPath.lineTo(-10,0);pointPath.arcTo(-10,0,20,20,180,180);QPainterPath inRing;inRing.addEllipse(-5,-5,10,10);painter.save();//计算并选择绘图对象坐标painter.rotate(degRotate - 120);painter.setBrush(QColor(255,255,255));painter.drawPath(pointPath.subtracted(inRing));painter.restore();
}//动态增加时速画面效果
void MainWindow::slot_speed_changed()
{if(direction == 1)//加速{degRotate++;if(degRotate > 240)degRotate = 240;}else if(direction == 0)//减速{degRotate--;if(degRotate < 0){degRotate = 0;myTimer->stop();}}update();//刷新画面。很重要!
}//按键按下事件
void MainWindow::keyPressEvent(QKeyEvent *event)
{if(event->key() == Qt::Key_Space){if(direction == 0){myTimer->start(1);direction = 1;}}
}
//按键释放事件
void MainWindow::keyReleaseEvent(QKeyEvent *event)
{if(event->key() == Qt::Key_Space){direction = 0;}
}MainWindow::~MainWindow()
{delete ui;
}

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

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

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

相关文章

网络安全概述(一)

目录 资产保护 资产的类型 资产损失类型 资产保护考虑因素 安全强度、安全代价和侵入可能性的关系 信息安全技术发展 单机系统的信息保密阶段 信息保障阶段 信息保障技术框架IATF PDRR模型 网络攻击类型 阻断攻击、截取攻击、篡改攻击、伪造攻击 被动攻击和主动攻…

C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码

1 双向链表 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循…

用来检查 CUDA、Conda 和 PyTorch 的版本的python文件

提供的 Python 代码片段包括几个语句&#xff0c;用来检查 CUDA、Conda 和 PyTorch 的版本&#xff0c;以及一些与 CUDA 相关的系统配置。让我们分解一下&#xff1a;PyTorch 版本和配置&#xff1a;torch.__config__.show()&#xff1a;显示 PyTorch 的构建配置。 torch.__ver…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

基于单片机负载控制的无人机电气设备监测系统设计

摘要:为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机…

nftables 测试一拒绝所有流量

要配置 nftables 先拒绝所有流量&#xff0c;然后再添加允许的规则&#xff0c;您可以按照以下步骤操作&#xff1a; 创建一个空的 nftables 配置文件&#xff08;例如 /etc/nftables.conf&#xff09;并添加如下内容&#xff1a; flush rulesettable inet filter {chain input…

Java学习—Stream流

Java 8引入的Stream API是对集合操作的一种高级抽象。Stream API不仅使代码更加简洁易读&#xff0c;还引入了函数式编程的强大功能&#xff0c;使得对集合的操作更加灵活和强大。让我们更详细地探讨Stream的核心概念、操作以及它在实际编程中的应用。 核心概念 Stream&#…

王者荣耀,急于补齐内容短板

问十个人&#xff0c;有九个人知道《王者荣耀》&#xff1b;但如果再问十个知道《王者荣耀》的人&#xff0c;这款游戏到底讲了一个什么故事&#xff0c;每个角色又有怎样的背景&#xff0c;可能十个人都不知道。 整个新年档口&#xff0c;《王者荣耀》都很忙碌。 1月&#x…

《HelloGitHub》第 95 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后&#xff0c;点击‘测试连接’&#xff0c;若提示成功&#xff0c;则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数&#xff1a; mail.catchall.alias: 收件服…

Vue页面更新后刷新页面不会渲染解决

小编今天犯了个很低级的错误&#xff0c;导致VUE页面刷新样式不会更新的问题&#xff01; 解决方法&#xff1a;查看你的路由路径大小写是否正确&#xff01;小编是犯了这种错误&#xff0c;特此分享下&#xff01;

Linux中docker项目提示No such file or directory

本来以为是文件权限问题&#xff0c;后来发现是个非常蠢的问题 文件没有映射到容器中 docker文件映射语法 Docker 使用 -v 或 --volume 参数来指定文件映射。 增加在运行命令后 -v <宿主机目录>:<容器目录> 其中&#xff0c;宿主机目录 是指要映射的宿主机上的…

【Django】执行查询—创建和修改对象

创建对象和修改对象 直接上例子&#xff1a; # 创建对象 >>> from blog.models import Blog >>> b Blog(name"Beatles Blog", tagline"All the latest Beatles news.") >>> b.save() # 修改对象 >>> b5.name &quo…

任务创建后只执行后创建的任务,不进行调度?

1、问题说明 通过HAL创建STM32裸机程序后&#xff0c;移植FreeRTOS程序且编译不报错。创建了两个串口打印的任务&#xff0c;却只有后创建的任务运行&#xff0c;不会进行任务间的调度。 主要代码&#xff1a; /**功能&#xff1a;将C库printf函数重定向到USART1*参数&#x…

oracle 数据库建集群式数据库的DBLINK的语法

根据需要修改以下红色字体的部分即可。 1、连接集群式数据库DBLINK语法 create public database link 自定义的dblink名字 connect to 连接对方数据库的用户名 identified by "密码" using (DESCRIPTION (ADDRESS_LIST (FAILOVER ON) (LOAD_BALANCE OFF) …

ROS 2基础概念#2:节点(Node)| ROS 2学习笔记

ROS 2节点简介 节点是执行计算的进程。节点组合在一起形成一个图&#xff08;graph&#xff09;&#xff0c;并使用主题&#xff08;topic&#xff09;、服务&#xff08;service&#xff09;和参数服务器&#xff08;paramter server&#xff09;相互通信。这些节点旨在以细粒…

进制转换md5绕过 [安洵杯 2019]easy_web1

打开题目 在查看url的时候得到了一串类似编码的东西&#xff0c;源码那里也是一堆base64&#xff0c;但是转换成图片就是网页上我们看见的那个表情包 ?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 我们可以先试把前面的img那串解码了 解码的时候发现长度不够&#xff0c;那我们…

博弈论---Nim游戏(公平组合游戏,概念,证明异或为0就是必败态,示例)

目录 概念&#xff1a; 公平组合游戏ICG 有向图游戏 Nim游戏 先手&#xff09;必胜状态 先手&#xff09;必败状态 如何确定先手是否必胜或者必败&#xff08;都采用最优策略&#xff09; 证明&#xff1a;全部异或为0则是必败状态 综上&#xff1a; 例子 概念&#…

babylonjs入门-基础模版+调试GUI

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 ​ 懒得打字&#xff0c;粘贴复制一气呵成

linux系统---LNMP架构下部署Discuz社区论坛与Wordpress博客

目录 一、编译安装Nginx 1、关闭防火墙 2、安装依赖包 3、创建运行用户 4、压缩软件包并编译安装 5、软链接路径优化 ​编辑 6、添加Nginx系统服务 二.编译安装MySQL服务 1.安装依赖环境 ​编辑 2、创建运行用户 3、编译安装 ​编辑 4、修改mysql 配置文件 5、…