使用Qt 搭建简单雷达

目录

 1.简易雷达图思维导图

2.结果展示图

3.制作流程

3.1表盘的绘制        

3.1.1 绘制底色

​编辑 3.1.2 绘制大圆

 3.3.3绘制小圆

3.3.4 绘制小圆的内容

3.3.5 绘制表盘刻度和数字标注

 3.3.6 绘制指针

 3.3.7 绘制扇形

3.2 设置定时器让表盘动起来

3.3.1 设置动态指针

 3.2.2 更新扇形区域


 1.简易雷达图思维导图

 

2.结果展示图

3.制作流程

3.1表盘的绘制        

创建Qt ->widget下项目接口。

        本示例使用的Qt 中的事件,所以,第一步重写 paintEvent()

widget.h 中添加

      Widget.cpp 中添加

void Widget:: paintEvent(QPaintEvent *event){}

3.1.1 绘制底色

        创建一个Qpainter 的类(this表明在最外面的窗口上绘制),同时alt+enter 导入头文件(不能导入,手动添加对应的头文件)

接下来设置抗锯齿,设置画刷颜色,最后绘制底层的矩形。

 3.1.2 绘制大圆

首先明确Qt的坐标

painter.translate 将坐标图的原点移动某一点。

进行变换之后做一个径向渐变,作为画刷来绘制大圆的圆内色。 最后绘制大圆

painter.setBrush(Qt::NoBrush);表明在接下绘制的圆形的内部不进行颜色覆盖。保留和大圆相同的颜色,只绘制小圆的轮廓即可。

 3.3.3绘制小圆

Qt中设置绘图时的画刷为无画刷,即不填充任何颜色或图案。这意味着在绘制图形时,不会使用画刷填充图形的内部,而只会绘制图形的轮廓。

通常情况下,当需要绘制只有轮廓而没有填充的图形时,可以使用 setBrush(Qt::NoBrush) 来设置画刷,以确保绘制的图形只有轮廓效果。

设置画刷和画笔,并进行绘制

3.3.4 绘制小圆的内容

 

在小圆内输入内容显示当前的速度,当然需要设置字体和brush ,最后使用drawText() ,其常用的构造函数有两个一个是,需要写字的(x,y) 和内容,另一个是输入一个QRect() ,在Rect内部中央进行书写。

3.3.5 绘制表盘刻度和数字标注

 首先保留现在的坐标位置信息

painter.save() 和painter.restore() 。

接下来进行旋转135都。painter.rotate() 进行顺时针旋转。

蓝色坐标处。此时,我们已经找到了刻度开始的起点了。

 

从start 到end 一共(360-90)=270°。我们希望其可以均分未50分,所以每一份角度是double(270/50)=angle.

此时就可以绘制刻度了

使用drawline()

起始的坐标是大圆的半径就是(height/2-3,0) ,其中-3 是裕量,具体值根据调试微调。重点是(height/2-20,0) ,其中-20是未来显示刻度线出来,接下来painter.rotate(angle).循环50词即可。

接下里是数字标注,为了显示清晰,每10次显示一下标注。调用一下drawText

 3.3.6 绘制指针

由于上面绘制刻度坐标信息打乱了,我希望角度位置信息恢复到rect.center() 状态。故使用

painter.restore() 恢复上调用painter.save()一个状态。

 同时绘制指针。

 3.3.7 绘制扇形

回到最原始的状态

3.2 设置定时器让表盘动起来

3.3.1 设置动态指针

 需要设置定时器,在.h 定义,.cpp 实现(private 属性),并定义currentValue 用于显示当前的值。使用信号与槽,如果定时器时间到了,更新currentValue(paintEvent 里面很多draw 函数和currentValue 相关,更新了值画面也就动起来)。由于表盘达到最大会反方向运行,所以需要设定一给bool 值用于判定指针方向,完成之后,调用update() 更新painterEvent 就可以东起来。最后将启动定时器,即可。

 3.2.2 更新扇形区域

同上。currentValue 更新即可。

3.3 完整代码

main.cpp

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

Widget.h

 

#ifndef WIDGET_H
#define WIDGET_H#include <QTimer>
#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) override;private:Ui::Widget *ui;int currentValue;QTimer *timer;int mark=0;
};
#endif // WIDGET_H

Widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QRadialGradient>
#include <QPainter>
#include<QFont>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);currentValue=0;timer=new QTimer();connect(timer,&QTimer::timeout,[=](){if(mark==0){currentValue++;if(currentValue>=51){mark=1;}}else if(mark==1){currentValue--;if(currentValue<=0){mark=0;}}update();});timer->setInterval(50);timer->start();
}Widget::~Widget()
{delete ui;
}void Widget:: paintEvent(QPaintEvent *event){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setBrush(QBrush(Qt::black));painter.drawRect(rect());painter.translate(rect().center());//    qDebug()<<width()<<height();QRadialGradient radialGradient(0,0,height()/2);radialGradient.setColorAt(0.0,QColor(255,0,0,50));radialGradient.setColorAt(1.0,QColor(255,0,0,250));painter.setBrush(QBrush(radialGradient));painter.setPen(Qt::white);painter.drawEllipse(QPoint(0,0),height()/2,height()/2);//painter.setBrush(Qt::NoBrush);QPen pen(Qt::white,3);painter.setPen(pen);painter.drawEllipse(QPoint(0,0),60,60);painter.setFont(QFont("华文宋体",15));painter.drawText(QRect(-60,-60,120,120),Qt::AlignCenter,QString::number(currentValue));painter.save();//旋转是按照顺时针进行旋转的从左到右进行旋转painter.rotate(135);double rotate=270*1.0/50;for(int i=0;i<=50;i++){if(i%10==0){//在表盘的左侧,需要先将文字旋转180°,在进行写字,之后进行变换。if(135+rotate*i<=270){painter.rotate(180);painter.drawText(-height()/2+25,7,QString::number(i));painter.rotate(-180);}else{//在 坐标x,y 进行写字绘图。  如果是构造函数是矩形的话,那么就在矩形 的内部进行绘图和构造。painter.drawText(height()/2-50,7,QString::number(i));}}painter.drawLine(height()/2-20,0,height()/2-3,0);painter.rotate(rotate);}painter.restore();painter.save();painter.rotate(135+rotate*currentValue);painter.drawLine(60,0,height()/2-55,0);//绘制扇形painter.restore();painter.setPen(Qt::NoPen);painter.setBrush(QColor(255,0,0,150));QRect rectangle(-height()/2+58,-height()/2+58,height()-116,height()-116);painter.drawPie(rectangle,(360-135)*16,-rotate*currentValue*16);}

没有自定义ui,直接在原图上进行绘画.

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

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

相关文章

Fastjson反序列化漏洞——JNDI注入

一.前言 之前使用反序列化和序列化时写入的到文件里面的&#xff0c;真实环境中&#xff0c;也是这样吗&#xff1f; 当然不是了&#xff0c;通过二进制&#xff0c;字节流数据进行的。 为什么会有JNDI&#xff1f; 由于http和ftp传输消耗资源仍然很大&#xff0c;就有了JRM…

EasyRecovery 17完美破解版 2024 年最新永久免费使用 EasyRecovery激活图文教程

我们在平时使用电脑或者操作文件过程中&#xff0c;或多或少都有过格式化文件或者为了方便&#xff0c;直接摁住了shifitdelete键&#xff1b;删除后发现&#xff0c;我们删错了&#xff0c;有些文件不是我们要删的&#xff0c;甚至有的文件是特别重要的&#xff1b;这时候恢复…

基于java 的医院排号管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)

摘要 为了克服常规PID控制方法在无人机俯仰姿态控制中的不足&#xff0c;本研究设计了一种基于模糊自适应PID控制的控制律。通过引入模糊控制器&#xff0c;实现了对输入输出论域的优化选择&#xff0c;同时解决了模糊规则数量与控制精度之间的矛盾。仿真结果表明&#xff0c;…

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解 1.FastGPT快速使用:基本设置、核心模块讲解 1.1 知识库设置 首先我们需要创建一个知识库。 知识库创建完之后我们需要上传一点内容。 上传内容这里有四种模式: 手动输入:手动输入问…

【网络】高级IO——poll版本TCP服务器

目录 前言 一&#xff0c;poll函数 1.1.参数一:fds 1.2.参数二&#xff0c;nfds 1.3.参数三&#xff0c;timeout 1.4.返回值 1.5.poll函数简单使用示例 二&#xff0c;poll版TCP服务器编写 2.1.编写 2.2.poll的优缺点 2.3.源代码 前言 由于select函数有下面几个特别…

奥维互动地图经纬度导入,再导出ovjsn再转化为kml格式

一、使用python将excel表中的经纬度换算成小数格式。 在文件上看到的经纬度是东经 1165′27.78″&#xff0c;北纬 2310′57.18″&#xff0c;要转化为116.09105,23.182550000000003 格式。如果要用vba编写函数&#xff0c;可能比较麻烦&#xff0c;为此我使用python来转化 i…

【例题】lanqiao3412 最小化战斗力差距

样例输入 3 1 2 3样例输出 1说明 样例中&#xff0c;当 a[1,3]&#xff0c;b[2]&#xff0c;此时战斗力差距为 1&#xff0c;无法得到比 1 更小的安排方式。 解题思路 目标是|max(a)-min(b)|最小&#xff0c;希望a里的最大值和b里的最小值能差距最小。 转化成&#xff1a;…

2024/9/16 英语每日一段

Stark argues that, in their gummies, at least,“The total sugar in a serving is less than in half a cherry.”Of course, cherries also provide fibre, vitamin C, and antioxidants--and 14 of them would count as one of your five-a-day. Artificial sweeteners to…

Linux操作系统文件权限管理

Linux操作系统下文件的权限分为当前用户权限、用户组权限和其他用户权限&#xff0c;然后每一类用户或组又分为读权限(r)、写权限(w)和可执行权限(x)。 如图1&#xff0c;打开任一目录&#xff0c;右键单击文件&#xff0c;在弹出菜单选择“属性”&#xff0c;在弹出的属性选项…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

1.3 计算机网络的分类

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型&#xff0c;本章从分布…

C语言刷题日记(附详解)(5)

一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…

HarmonyOS使用LocationButton获取地理位置

LocationButton LocationKit getAddressesFromLocation方法 步骤&#xff1a; 整合 LocationButton并获取经纬度通过 LocationKit 将经纬度转为地址信息将地址信息渲染到页面上处理异常情况&#xff08;闪退&#xff09; LocationButton({ icon: LocationIconStyle.LINE…

robomimic基础教程(一)——基本概念

robosuite和robomimic都是由ARISE Initiative开发的开源工具&#xff0c;旨在推进机器人学习和机器人操作领域的研究。 一、基本概念 robomimic是一个用于机器人示范学习的框架。它提供了在机器人操作领域收集的大量示范数据集&#xff0c;以及用于从这些数据集中学习的离线学…

初始爬虫6

数据提取 数据提取总结 响应分类 结构化 json数据&#xff08;高频出现&#xff09; json模块 jsonpath模块 xml数据&#xff08;低频出现&#xff09; re模块 …

基于Python DoIPClient库的DoIP上位机开发手顺

代码 address, announcement DoIPClient.await_vehicle_announcement()logical_address announcement.logical_addressip, port addressprint(ip, port, logical_address) 效果 代码 address, announcement DoIPClient.get_entity(ecu_ip_addresssIp, protocol_version3…

重生归来之挖掘stm32底层知识(1)——寄存器

概念理解 要使用stm32首先要知道什么是引脚和寄存器。 如下图所示&#xff0c;芯片通过这些金属丝与电路板连接&#xff0c;这些金属丝叫做引脚。一般做软件开发是不需要了解芯片是怎么焊的&#xff0c;只要会使用就行。我们平常通过编程来控制这些引脚的输入和输出&#xff0c…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)

一、预览 实现功能:通过vue标题栏按钮锁屏和关机 1.1 预览 1.2 代码 锁屏代码csharp LockWorkStation() 关机代码chsharp 注意vue代码参数和此参数一致(0/1/2) 方法ExitWindowsEx()

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \