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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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();
}

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

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

相关文章

Java学习笔记2024/2/23

今日内容 多态 包 final 权限修饰符 代码块 教学目标 能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点描述final修饰的变量的特点 第…

Android Studio六大基本布局详解

在Android Studio中&#xff0c;六大基本布局用于构建用户界面的结构和外观。这些布局类型提供了不同的方式来组织和排列界面元素&#xff0c;以创建出各种复杂和灵活的界面设计。以下是这六大基本布局的详解&#xff1a; LinearLayout&#xff08;线性布局&#xff09;&#x…

k8s-配置与存储-配置管理

文章目录 一、配置存储1.1 ConfigMap1.1.1.基于文件夹的创建方式1.1.2指定文件的创建方式1.1.3 配置文件创建configmap 1.2 Secret1.2.1Secret的应用与Docker仓库 Secret设置1. Kubernetes 中的 Secrets&#xff1a;创建 Secret 示例&#xff1a;将 Secret 挂载到 Pod 中的示例…

Python爬虫-报错requests.exceptions.SSLError: HTTPSConnectionPool

在学习python爬虫&#xff0c;在公司运行代码没有问题&#xff0c;但是下班回来把代码拉下来运行&#xff0c;却出现问题。 问题&#xff1a; requests.exceptions.SSLError: HTTPSConnectionPool(host‘campusgateway.51job.com’, port443): Max retries exceeded with url…

Flashbit空投

空投要点 明牌空投交互简单&#xff0c;仅需3步&#xff0c;零gas费要求加密钱包在eth链有过交易需要有x和discord账号 空投简介 是一个社区驱动的项目&#xff0c;专门针对Blast生态&#xff0c;项目方提出了空投计划&#xff0c;参与过该生态其他项目空投的都清楚&#xf…

【Delphi 基础知识 35】MainMenu控件的详细使用

把TmenuMain放在Form后&#xff0c;右击控件就可以对菜单进行设计 菜单中添加分割线只需加“-”就可以添加一个分割线 级联菜单的设计 单击鼠标右键弹出菜单中选择Create Submenu菜单项 单选功能设计 要在设计的菜单项目中选择RadioItem属性为True&#xff0c;Checked属性…

Git介绍与使用

Git介绍与常用命令的使用 目录: 一、Git简介 二、Git简单命令行入门 三、Git常用命令 四、常见问题补充 一、Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。特点&…

Chat With RTX 安装、使用问题记录

1.安装包运行检测环境失败 安装适合的的CUDA&#xff1a;https://developer.nvidia.com/cuda-downloads?target_osWindows&target_archx86_64&target_version11 2.安装Chat With RTX 和 模型 Mistral 7B 失败 科学上网&#xff0c;可以单独装Chat With RTX 先&…

Windows+Yolo3-darknet训练自己数据集并测试

WindowsYolo3-darknet训练自己的数据集并测试 一、首要条件 Windows 7下配置好VS2015OPENCV3.4.2YOLO3CUDA10.0CUDNN7.5生成darknet.exe。具体配置可参考我的博客&#xff1a;https://blog.csdn.net/wszswllnzn_/article/details/100760477 二.制作数据集 1、方法1 使用软件la…

ASPxGridView中使用PopupEditForm表单字段联动填充

c#中devexpress的控件ASPxGridView中使用PopupEditForm表单字段联动填充 //选择项目名称&#xff0c;自动填充项目编号 <Columns><dx:GridViewDataTextColumn FieldName"id" ReadOnly"True" VisibleIndex"0" Visible"False"…

com.alibaba.nacos.api.exception.NacosException: Request nacos server failed

问题描述 安装nacos2.0以上版本&#xff0c;启动报错:com.alibaba.nacos.api.exception.NacosException: Request nacos server failed com.alibaba.nacos.api.exception.NacosException: Request nacos server failed: at com.alibaba.nacos.client.naming.remote.gprc.Nami…

MFC 多文档程序的基本编程

下载了一个openGL mfc的多文档程序,以此来学习mfc多文档模式的编程; 1 基本编程 它每次新建一个文档,会在窗口绘制一个三角形、一个矩形;如果没有了图形刷新一下; 先看一下为什么每次打开新文档会绘制图形; 生成工程之后主要有5个类,比单文档程序多了一个子框架类; 可…

记录一下我的Ruby On Rails的systemd服务脚本

自己也是一个 ROR 框架的学习者&#xff0c;同时也是 Ruby 的新手。对于如何让 ROR 应用随系统自动启动并不是很了解。在尝试了各种方法之后&#xff0c;我最终找到了一条可行的途径。虽然不确定是否完全正确&#xff0c;但服务已经成功启动了。因此&#xff0c;我决定在这里保…

hive中如何取交集并集和差集

交集 要获取两个表的交集&#xff0c;你可以使用INNER JOIN或者JOIN&#xff1a; SELECT * FROM table1 JOIN table2 ON table1.column_name table2.column_name;也可以使用 INTERSECT 关键字 SELECT * FROM table1 INTERSECT SELECT * FROM table2;并集 要获取两个表的并集…

华为HCIP Datacom H12-831 卷23

单选题 1、某园区部署IS-IS实现网络互通&#xff0c;在所有IS-IS路由器的进程中配置命令flash-flood 6 max-timer-interval 100 Leve1-2&#xff0c;则以下关于该场景的描述,正确的是哪—项? A、若某IS-IS路由器LSDB内更新的LSP数量为5,则在100毫秒内且路由计算完成前&#…

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错&#xff1a;java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时&#xff0c;第一次成功插入&#xff0c;第二次出现以下错误&#xff1a…

【力扣经典面试题】238. 除自身以外数组的乘积

目录 一、题目描述 二、题解分析 思路&#xff1a; 算法步骤&#xff1a; 代码(C版)&#xff1a; 三、总结 一、题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证…

【八股文面试】Java基础常见面试题总结(上)

Java基础常见面试题总结(上) Java有哪些特性 简单易学&#xff1b;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b;支持多线程&#xff08; C 语言没有内置的多…

K8S-001-Virtual box - Network Config

A. 配置两个IP&#xff0c; 一个连接内网&#xff0c;一个链接外网: 1. 内网配置(Host only&#xff0c; 不同的 virutal box 的版本可以不一样&#xff0c;这些窗口可能在不同的地方&#xff0c;但是配置的内容是一样的): 静态IP 动态IP 2. 外网&#xff08;创建一个 Networ…

petalinux_zynq7 驱动DAC以及ADC模块之一:建立IP

0. 环境 - ubuntu18 - vivado 2018.3 - mizar z7010 ada106模块 1. vivado 1.1 创建vivado工程 运行vivado source /tools/Xilinx/Vivado/2018.3/settings64.sh vivado& 创建vivado工程 Vivado -> Create Project -> Next -> -> Project name: …