自定义圆形进度条控件

news/2024/11/13 10:29:12/文章来源:https://www.cnblogs.com/DesertCactus/p/18538100

以下将以创建一个简单的为例,详细说明在Qt中创建自定义控件的步骤:

一、创建项目

首先,打开Qt Creator并创建一个新的Qt Widgets Application项目。按照向导完成项目的基本设置,比如项目名称、存储路径等。

二、创建自定义控件类

  1. 继承基础控件类
    • 在项目中创建一个新的C++类,命名为 CircleProgressBar。让这个类继承自 QWidget,因为我们要创建一个独立的可视化控件,QWidget 是Qt中大多数可视化控件的基类。
#include <QWidget>class CircleProgressBar : public QWidget
{Q_OBJECT
public:explicit CircleProgressBar(QWidget *parent = nullptr);signals:public slots:private:};
  1. 添加构造函数
    • CircleProgressBar 类中添加构造函数,用于初始化控件的一些基本属性,如大小、颜色等。
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>class CircleProgressBar : public QWidget
{Q_OBJECT
public:explicit CircleProgressBar(QWidget *parent = nullptr) : QWidget(parent){setFixedSize(200, 200); // 设置控件的固定大小为直径200像素的圆形progress = 0; // 初始进度为0backgroundColor = Qt::lightGray; // 设置背景颜色为浅灰色progressColor = Qt::blue; // 设置进度条颜色为蓝色}signals:public slots:private:int progress;QColor backgroundColor;QColor progressColor;
};

在上述构造函数中,通过调用 setFixedSize 函数设置了控件的大小为一个直径200像素的圆形。同时,初始化了进度值为0,并设置了背景颜色和进度条颜色。

三、重写绘制事件函数

为了能够在控件上绘制出圆形进度条的外观,需要重写 QWidgetpaintEvent 函数,在该函数中使用 QPainter 类来进行绘制操作。

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>class CircleProgressBar : public QWidget
{Q_OBJECT
public:explicit CircleProgressBar(QWidget *parent = nullptr) : QWidget(parent){setFixedSize(200, 200);progress = 0;backgroundColor = Qt::lightGray;progressColor = Qt::blue;}protected:void paintEvent(QPaintEvent *event) override{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿,使绘制的图形更平滑// 绘制背景圆形painter.setPen(Qt::NoPen);painter.setBrush(backgroundColor);painter.drawEllipse(rect());// 绘制进度条圆形painter.setPen(Qt::NoPen);painter.setBrush(progressColor);int arcLength = (progress / 100.0) * 360 * 16; // 根据进度计算弧长,乘以16是因为QPainter绘制弧形的单位要求painter.drawArc(rect(), 90 * 16, arcLength);}signals:public slots:private:int progress;QColor backgroundColor;QColor progressColor;
};

paintEvent 函数中:

  • 首先创建了一个 QPainter 对象,并开启了抗锯齿功能,以获得更平滑的绘制效果。
  • 然后使用 QPainter 绘制了背景圆形,通过设置画笔为 Qt::NoPen(即不绘制轮廓线),设置画刷为背景颜色,再使用 drawEllipse 函数根据控件的矩形区域(通过 rect() 函数获取)绘制出背景圆形。
  • 接着绘制进度条圆形,同样设置画笔为 Qt::NoPen,画刷为进度条颜色,根据当前进度计算出弧长,再使用 drawArc 函数在背景圆形上绘制出进度条弧形。

四、添加设置进度的函数

为了能够在外部方便地设置圆形进度条的进度值,需要添加一个公共函数来实现此功能。

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>class CircleProgressBar : public QWidget
{Q_OBJECT
public:explicit CircleProgressBar(QWidget *parent = nullptr) : QWidget(parent){setFixedSize(200, 200);progress = 0;backgroundColor = Qt::lightGray;progressColor = Qt::blue;}void setProgress(int value){progress = value;update(); // 更新控件的显示,以便重新绘制进度条}protected:void paintEvent(QPaintEvent *event) override{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 绘制背景圆形painter.setPen(Qt::NoPen);painter.setBrush(backgroundColor);painter.drawEllipse(rect());// 绘制进度条圆形painter.setPen(Qt::NoPen);painter.setBrush(progressColor);int arcLength = (progress / 100.0) * 360 * 16;painter.drawArc(rect(), 90 * 16, arcLength);}signals:public slots:private:int progress;QColor backgroundColor;QColor progressColor;
};

setProgress 函数中,首先更新了内部的进度值变量,然后调用 update() 函数,该函数会触发 paintEvent 函数的重新执行,从而根据新的进度值重新绘制进度条。

五、在主窗口中使用自定义控件

  1. 包含头文件
    • 在主窗口的头文件(通常是 mainwindow.h)中,包含自定义控件类的头文件。
#include <QMainWindow>
#include "CircleProgressBar.h"class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();private:CircleProgressBar *circleProgressBar;
};
  1. 创建并设置自定义控件
    • 在主窗口的构造函数中,创建自定义控件对象,并设置其在主窗口中的位置等属性。
#include <QMainWindow>
#include "CircleProgressBar.h"MainWindow::MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{circleProgressBar = new CircleProgressBar(this);circleProgressBar->setProgress(50); // 设置初始进度为50%circleProgressBar->move(50, 50); // 将控件移动到主窗口的指定位置setFixedSize(300, 300); // 设置主窗口的固定大小
}MainWindow::~MainWindow()
{delete circleProgressBar;
}

在上述主窗口的构造函数中,首先创建了 CircleProgressBar 控件对象,并将其所属的父控件设置为当前主窗口。然后设置了初始进度为50%,并将控件移动到主窗口内的指定位置。最后设置了主窗口的固定大小。

通过以上步骤,我们成功创建了一个简单的自定义圆形进度条控件,并在主窗口中进行了使用。你可以根据实际需求进一步扩展和完善这个自定义控件的功能,比如添加动画效果、响应鼠标事件等。

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

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

相关文章

腾讯云云服务器数据迁移实战方案

前言 我在三年前购买的腾讯云服务器今年过期咯, 今年的腾讯云双十一活动也是给力优惠攻略极速观看: 刻不容缓腾讯云双十一活动羊毛攻略!!!-腾讯云开发者社区-腾讯云 极速通道购买: 腾讯云11.11上云拼团Go 经过上面的攻略我购买了一个 2h4g 和 4h8g 的云服务器, 我将 Mysql 、Re…

20222418 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

Windows 10 配置为 NTP 时间服务器的操作步骤及解析

之前有过将 Windows 10 配置为 NTP 时间服务器的经历,但是没有做文字记录。 这次又需要做一样的配置,对网上的资料和配置细节不太确定,所以设置完后写了本篇记录。 操作步骤设置服务器类型为 NTP;修改注册表键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32…

20222302 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 1.1恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用超…

2024-2025-1 20241415 《计算机基础与程序设计》第七周学习总结

2024-2025-1 20241415 《计算机基础与程序设计》第七周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、…

MAC下使用Clion软件进行STM32的HAL库的开发

1、准备的软件 (1)clion: 链接:https://www.jetbrains.com.cn/clion/ 破解:方法可在某宝上去找。 (2)STM32CubeMX与ST_Link: 链接:https://www.st.com.cn/content/st_com/zh/stm32cubemx.html 破解:免费使用 mac电脑在安装的时候会出现上面的界面,依次安装即可。 (3)macOS…

2024-2025-1 20241314 《计算机基础与程序设计》第七周学习总结

2024-2025-1 20241314 《计算机基础与程序设计》第七周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 数组与链表 基于数组和基于链表实现数据结构…

二进制和格雷码转换

二进制和格雷码转换 二进制转为格雷码//根据二进制转换成格雷码的法则,可以得到以下的代码: static unsigned int DecimaltoGray(unsigned int x) {return x^(x>>1); }//以上代码实现了unsigned int型数据到格雷码的转换,最高可转换32位自然二进制码,超出32位将溢出。…

在鸿蒙NEXT中开发一个2048小游戏

本项目是基于api12开发的2048游戏,游戏的逻辑是当用户向某个方向滑动时,将该方向相邻且相等的数字相加,同时在空白区域的随机位置生成一个随机数字。游戏中的数字越大,分数越高。首先,游戏的界面布局分别采用两个网格组件Grid来实现,难点在于上方的菜单栏是不均等的三种尺…

nginx 整体架构

Nginx 是什么 Nginx 是一款 C 语言编写高性能 Web 服务器,反向代理服务器。占用内存少、并发能力强 使用场景 nginx主要有以下 4 个使用场景作为 Http 服务器,可以提供静态网页和静态资源的访问 HTTP代理缓存,缓存服务端请求数据 作为反向代理服务器,将请求代理转发 作为负…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 打开实例发现是个POST注入框盲猜SQL注入,万能密码检测无果,而且经过测试存在大量sql关键字过滤尝试使用(),出现了bool(false),确定这是一道布尔注入题and被禁用,决定采用异或^注入 构建payload脚本梭哈:成功获得flag:flag{a2…

2024 AH CSP-S 迷惑行为大赏

洛谷专栏阅读:https://www.luogu.com.cn/article/0atx674s 一、概述 观前提示:本届CSP-S安徽省整活相较于其他省份不是那么“群英荟萃”,观看前请不要小零食(?) 本届CSP-S安徽共有1013人参赛,其中有效准考证号源文件夹共有1006个,7人因为种种原因最终没有留下任何参赛痕…