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

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

最终效果

ui,创建一个空的widget

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QTimer>

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 maxValue = 50;
    int minValue = 0;
    int curValue = 20;

    QTimer *timer;
};
#endif // WIDGET_H

widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include <QPolygon>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() {
        curValue += 1;
        if (curValue > maxValue) {
            curValue = minValue;
        }
        update();
    });
    timer->start(100);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 将painter移动到中心位置
    painter.translate(rect().center());

    // 画一个带有渐变色的圆圈
    // 镜像渐变
    QRadialGradient ra(0, 0, qMin(width(), height() / 2));
    // 设置起点颜色
    ra.setColorAt(0, Qt::green);
    // 终点颜色
    ra.setColorAt(1, Qt::cyan);
    painter.setBrush(ra);
    painter.setPen(Qt::NoPen);
    painter.drawEllipse(QPoint(0, 0), qMin(width(), height()) / 2, qMin(width(), height()) / 2);

    qreal angle = 270 * 1.0 / (maxValue - minValue);
    // 135°为刻度的起始点对应的角度
    painter.rotate(135);
    // 绘制刻度线
    painter.setPen(QPen(Qt::white, 4));
    painter.setFont(QFont("微软雅黑", 18));
    for (int i = minValue; i <= maxValue; ++i) {
        if (i % 10 == 0) {
            if (135 + angle * i < 270) {
                painter.rotate(180);
                painter.drawText(-qMin(width(), height()) / 2 + 30, 10, QString::number(i));
                painter.rotate(-180);
            } else {
                painter.drawText(qMin(width(), height()) / 2 - 20 - 50, 10, QString::number(i));
            }
            // 第一个参数是起始点的 x 坐标,第二个参数是起始点的 y 坐标,第三个参数是终止点的 x 坐标,第四个参数是终止点的 y 坐标。
            painter.drawLine(qMin(width(), height()) / 2 - 20, 0, qMin(width(), height()) / 2, 0);
        } else {
            painter.drawLine(qMin(width(), height()) / 2 - 10, 0, qMin(width(), height()) / 2, 0);
        }
        painter.rotate(angle);
    }
    // 刻度画完后,将painter旋转至水平向下的角度,以便在中心位置绘制文字
    // 之前时顺时针旋转的,现在逆时针旋转45°就可以了
    painter.rotate( - angle - 45);
    // 绘制一个圆圈
    // `painter.drawEllipse()` 函数的第二个和第三个参数分别表示椭圆的半长轴长度和半短轴长度。
    painter.drawEllipse(QPoint(0, 0), 100, 100);
    // 绘制文字
    // QRect(-100, -100, 200, 200)是一个矩形,其四个数字分别表示矩形的左上角坐标 `(x, y)` 和矩形的宽度和高度 `(w, h)`。
    // 以坐标原点为中心的 200x200 的矩形内绘制一个字符串
    // 矩形的左上角的坐标是 `(-100, -100)`,也就是在坐标原点的左上角位置偏移了 100 个像素的位置。
    // 这里的 `-100` 表示的是相对于坐标空间原点的坐标偏移量,而不是屏幕上的实际像素值。
    // 这个矩形的宽度和高度均为 `200`,因此其右下角的坐标为 `(100, 100)`。
    // 参数 `Qt::AlignCenter` 表示绘制文本时文字水平和竖直方向的对齐方式。
    // 这里使用了 `Qt::AlignCenter` 表示文本应该水平居中和竖直居中对齐。
    painter.drawText(QRect(-100, -100, 200, 200), Qt::AlignCenter, QString::number(curValue));

    // painter的x轴回到刻度起始位置
    painter.rotate(135 + curValue * angle);
    // `width()` 和 `height()` 函数返回的分别是 `QWidget` 控件的宽度和高度。
    painter.drawLine(100, 0, qMin(width(), height()) / 2 - 20 - 50, 0);

    // 绘制扇形渐变色
    painter.rotate(-135 - curValue * angle);
    painter.setBrush(QColor(255, 0, 0, 100));
    painter.setPen(Qt::NoPen);
    painter.drawPie(QRect(-qMin(width(), height()) / 2 + 20 + 50,
                            -qMin(width(), height()) / 2 + 20 + 50,
                            qMin(width(), height()) - 40 - 100,
                            qMin(width(), height()) - 40 - 100),
                            (360 - 135) * 16,
                            -curValue * angle * 16);
}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)

OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用OSPF Version 2&#xff0c;针对IPv6协议使用OSPF Version 3。 在OSPF出现前&#xff0c;网络…

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; CUDA编程模型 我们使用CUDA_C语言进行CUDA编程&am…

软考-中级-系统集成2023年综合知识(三)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 软考中级专栏回顾 专栏…

协议的概念+本质+作用+最终表现形式,网络问题(技术+应用+解决的协议+存在原因),主机的对称性

目录 协议 概念 示例 -- 摩斯密码 本质 作用 网络问题 引入 技术问题 应用问题 主机的对称性 问题对应的协议 问题出现的原因 理解协议(代码层面) 举例 -- 快递单 协议的最终表现形式 协议被双方主机认知的基础 协议 概念 协议是在计算机通信和数据传输中规定通…

CSAPP-计算机系统漫游

文章目录 概念扫盲思想理解经典好图 概念扫盲 1.主存由DRAM&#xff08;动态随机存储器&#xff09;组成 2.处理器的核心为PC&#xff08;程序计数器&#xff09;&#xff0c;大小为一个字 3.总线被设计为传送定长的字节块&#xff08;字&#xff09; 4.堆在运行时由malloc类型…

arcgisPro制图输出

1、设置地图底图 2、导入数据 3、 设置图形颜色&#xff0c;如下&#xff1a;右键“浙江省”数据层&#xff0c;选择符号系统 4、在右侧可看到打开的符号系统栏&#xff0c;进行如下设置: 5、移除“其他所有值”项&#xff0c;如下&#xff1a; 6、设置图形轮廓&#xff0c;如下…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

【Ubuntu】Anaconda的安装和使用

目录 1 安装 2 使用 1 安装 &#xff08;1&#xff09;下载安装包 官网地址&#xff1a;Unleash AI Innovation and Value | Anaconda 点击Free Download 按键。 然后 点击下图中的Download开始下载安装包。 &#xff08;2&#xff09;安装 在安装包路径下打开终端&#…

社区志愿者齐心协力,为社区居民营造温馨和谐环境

近日&#xff0c;在我们的社区里&#xff0c;一场温暖而有力的力量正在悄然兴起。一群热心居民自发组织成为社区志愿者团队&#xff0c;积极投身于服务社区的各项活动中&#xff0c;为居民们营造了一个温馨和谐的生活环境。 在每个周末的清晨&#xff0c;志愿者们早早地聚集在社…

新手入门C语言之移位操作符和位操作符

在C语言中&#xff0c;移位操作符和位操作符是专门针对二进制的数字进行&#xff0c;因此&#xff0c;在描述移位操作符和位操作符之前&#xff0c;我们先来了解十进制&#xff0c;二进制&#xff0c;八进制&#xff0c;十六进制等的含义以及相互之间的转化。 一.进制以及相互…

Qt 设置隐式加载dll路径

在c++中DLL的加载方式有两种,显式加载和隐式加载。 隐式加载 在程序从开始运行时,就会按照系统中一定的搜索路径,寻找动态库,找到就自动加载它,才能成功运行程序,这些步骤,是系统自动完成的。 显示加载 我们对动态库的调用,是在代码中直接使用LoadLibrary,或其他加载函…

Project_Euler-26 题解

Project_Euler-26 题解 题目 思路 暴力枚举。 题目中已经给了一个范围&#xff1a; d < 1000 d<1000 d<1000&#xff0c;我们可以尝试顺着这个思路往下走&#xff0c;遍历这1000个值&#xff0c;分别查看 1 / d 1/d 1/d 的值中有没有循环节&#xff0c;并看看他们有…

python快速实现可使用不同颜色画笔的画布功能界面

核心组件&#xff1a;tkinter库 Tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;工具包&#xff0c;它提供了创建GUI应用程序的功能。Tkinter是Python自带的库&#xff0c;因此无需额外安装即可使用。它基于Tk GUI工具包&#xff0c;是Python的标准GUI工具包之一…

Linux修改shell工具连接端口

nano /etc/ssh/sshd_config 或者 vi /etc/ssh/sshd_config 或者 vim /etc/ssh/sshd_config

idea2023新UI风格不见了怎么办?

用了一段时间idea2023,有一天不知道点了什么&#xff0c;整个UI又变成了2022的风格 如果想换成2023的UI风格怎么办&#xff1f; 点击file->setting->new UI->勾选Enable new UI&#xff0c;restart就可以回到最新版本的UI了 新风格

JavaSE-05笔记【面向对象02】

文章目录 1. 类之间的关系2. is-a、is-like-a、has-a2.1 is-a2.2 is-like-a2.3 has-a 3. Object类3.1 toString()3.2 finalize()&#xff08;了解即可&#xff09;3.3 与 equals 方法 4. package 和 import4.1 package4.2 import4.3 JDK 常用开发包 5. 访问权限控制5.1 privat…

[DP学习] 期望DP

一般思路 注&#xff1a;可以用方差求平方的期望 例题一 思路 重点&#xff1a;如何设状态&#xff0c;如何转移。 设状态 f[i] i 张能买到不同卡片的种类数的期望值&#xff08;直接对问题设置状态&#xff09; 状态转移&#xff1a;由于从f[i1]转移到 f[i] 时&#xff0…

什么是飞行时间传感器以及 ToF 传感器如何工作?

译自https://www.seeedstudio.com/blog/2020/01/08/what-is-a-time-of-flight-sensor-and-how-does-a-tof-sensor-work/ 作者:亿达 您是否听说过飞行时间(也称为 ToF)用于您的手机、相机等,但不知道它们的用途及其工作原理? 通过本指南,您将了解有关 ToF 传感器和相机的…

unity学习(38)——创建(create)角色脚本(panel)--EventSystem

1.在scripts文件夹下创建一个脚本CreatePlayerPanel.cs&#xff0c;脚本挂到panel上&#xff01;给panel加个tag&#xff0c;叫createPanel&#xff0c;脚本内容如下&#xff1a; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngin…

javaEE图书馆自习室订座系统信用springmvc+springboot+mybatis

研究的内容是设计和实现图书馆自习室系统&#xff0c;便捷广大师生对自习室的使用&#xff0c;协助图书馆自习室管理。在设计过程中&#xff0c;系统的用户角色和权限分配如下&#xff1a; &#xff08;1&#xff09;馆长 用户管理&#xff1a;拥有自习室管理员、普通用户的所有…