使用Qt 搭建简单雷达

news2024/9/19 21:46:28

目录

 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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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.coloradmin.cn/o/2141370.html

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

相关文章

Excel图片批量插入单元格排版处理插件【图片大师】

为了方便大家在图片的插入排版的重复工作中解放出来&#xff0c;最近发布了一款批量插入图片的插件&#xff0c;欢迎大家下载&#xff0c;免费试用。 这是图片的文件夹&#xff1a; 主要功能如下: 1&#xff0c;匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…

【1.使用Index和Match函数自动补全内容】

目录 前言如何利用函数自动填充内容效果学会使用的方法(文字图片版本)只管使用&#xff0c;不看原理原理解读MATCH函数INDEX函数组合 学会使用的方法(视频版本) 后言最后想说的话 前言 如何利用函数自动填充内容 先说结论&#xff0c;本文的目的是通过使用Excel的函数&#xf…

深度强化学习Reinforcement Learning|PG|Actor-Critic|A3C|DDPG

目录 一、PG(Policy Gradient)策略梯度算法&#xff08;on-policy&#xff09; 1、策略梯度公式推导 2、代码讲解/伪代码 3、改进 3.1Trick Baseline 3.2 Suitable Credit 二、Actor-Critic算法 三、A3C算法 四、DDPG算法 前言 我们都知道强化学习环境env的不确定性是…

TCP协议分析《实验报告》

一、实验目的 1、理解TCP协议&#xff1b; 2、掌握TCP协议三次握手建立连接和四次挥手释放连接的过程&#xff1b; 3、理解TELNET协议及工作过程&#xff1b; 4、掌握TCP协议分析方法。 二、实验设备和环境 1、硬件设备&#xff1a;PC机或笔记本电脑&#xff1b; 2、软件…

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注&#xff1a;每个版本的补充离散库不一定相同&#xff0c;也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…

OpenCV_图像旋转超详细讲解

图像转置 transpose(src, dst); transpose()可以实现像素下标的x和y轴坐标进行对调&#xff1a;dst(i,j)src(j,i)&#xff0c;接口形式 transpose(InputArray src, // 输入图像OutputArray dst, // 输出 ) 图像翻转 flip(src, dst, 1); flip()函数可以实现对图像的水平翻转…

re题(24)BUUFCTF-[WUSTCTF2020]level1

BUUCTF在线评测 (buuoj.cn) 放到ida 这是下载的文本 逻辑比较简单&#xff0c;写个脚本 p[198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000] for i in range(1,20):if (i & 1) ! 0 :p[i-1]chr(p[i-1] >> i)…

C++ ——string的模拟实现

目录 前言 浅记 1. reserve&#xff08;扩容&#xff09; 2. push_back&#xff08;尾插&#xff09; 3. iterator&#xff08;迭代器&#xff09; 4. append&#xff08;尾插一个字符串&#xff09; 5. insert 5.1 按pos位插入一个字符 5.2 按pos位插入一个字符串 …

C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)

全网唯一递归法&#xff1a; vector<vector<int>> generate(int numRows) {vector<int> v;vector<vector<int>>vn;if (numRows 1){v.push_back(1);vn.push_back(v);v.clear();return vn;//递归记得return}if (numRows 2){v.push_back(1);vn.p…

FPGA与Matlab图像处理之伽马校正

文章目录 一、什么是伽马校正&#xff1f;二、伽马校正的由来三、Matlab实现伽马校正3.1 matlab代码3.2 matlab结果 四、Verilog实现伽马校正4.1 生成初始化ROM文件4.2 Verilog代码4.3 仿真结果 一、什么是伽马校正&#xff1f; Gamma校正是图像处理中用以调整图像的亮度和对比…

代码随想录冲冲冲 Day47 单调栈Part1

739. 每日温度 初步了解单调栈&#xff0c;根本思想就是如果求的是一个元素右边或左边第一个最大的元素 那么就是递增栈&#xff0c;如果是最小的就是递减栈 首先先放入一个0代表 第一个元素的index 之后开始for loop 当后面的值小于等于这个top时 就要先把index放入st中&a…

Leetcode 找到字符串中所有字母异位词

在 C 中&#xff0c;两个 vector<int> 类型的变量进行 操作时&#xff0c;会逐个比较它们的元素&#xff0c;只有当两个向量的长度相同且每个位置上的元素值都相同时&#xff0c; 操作才会返回 true。 因此&#xff0c;在这道题的代码中&#xff0c;sCount pCount 这一…

Flip动画的实现示例demo

Flip动画的实现示例demo 文章说明核心代码效果展示Flip动画工具类的封装 文章说明 文章主要为了学习flip动画的实现思路&#xff0c;并且采用此示例效果来理解该实现思路的含义 参考渡一前端袁老师的讲解视频 核心代码 采用简单的y轴变化的动画效果为示例 <!DOCTYPE html>…

【K230 实战项目】气象时钟

【CanMV K230 AI视觉】 气象时钟 功能描述&#xff1a;说明HMDI资源3.5寸屏幕 使用方法 为了方便小伙伴们理解&#xff0c;请查看视频 B站连接 功能描述&#xff1a; 天气信息获取&#xff1a;通过连接到互联网&#xff0c;实时获取天气数据&#xff0c;包括温度、湿度、天气状…

【STM32】独立看门狗(IWDG)原理详解及编程实践(上)

本篇文章是对STM32单片机“独立看门狗&#xff08;IWDG&#xff09;”的原理进行讲解。希望我的分享对你有所帮助&#xff01; 目录 一、什么是独立看门狗 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;、独立看门狗的原理 &#xff08;三&#xff09;、具体操…

vulkano (rust) 画一个三角形 (vulkan 渲染窗口初始化 (Linux) 下篇)

上文说到, vulkan 相比 OpenGL (ES), 更加贴近底层硬件, 许多东西需要应用软件手动管理, 所以 vulkan 的初始化过程比较麻烦, 或者说学习曲线比较陡峭. 但是, 这种麻烦是一次性的, 一旦学会了, 就能开始享受 vulkan 的诸多好处啦 ~ 本文以绘制一个三角形为例, 介绍 vulkan 的初…

2024最新版,人大赵鑫老师《大语言模型》新书pdf分享

本书主要面向希望系统学习大语言模型技术的读者&#xff0c;将重点突出核心概念与 算法&#xff0c;并且配以示例与代码&#xff08;伪代码&#xff09;帮助读者理解特定算法的实现逻辑。由于大语言模型技术的快速更迭&#xff0c;本书无法覆盖所有相关内容&#xff0c;旨在梳理…

瓶中水位检测系统源码分享

瓶中水位检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【数据结构】图的概念和存储结构

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C游记》《进击的C》《Linux迷航》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、图的概念二、图的存储结构2.1 邻接矩阵2.1.1 成员变量与默认成员函数2.1.2 GetIndex2.1.3 AddEdge2.1.4 Pr…

使用 Java 初步搭建简单Spring 项目框架:

一、准备工作 安装 Java Development Kit (JDK)&#xff0c;确保环境变量配置正确。 安装一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;如 IntelliJ IDEA 或 Eclipse。 二、创建项目——具体步骤 在 ider 中创建一个新的 Maven 项目 使用 Maven&#xff1a; 在…