当前位置: 首页 > news >正文

Python GUI 之创建一个圆形进度条控件:RoundProgress

在图形用户界面(GUI)设计中,进度条是一种常见的元素,用于直观地展示任务的完成进度。实现自定义圆形进度条控件,这个控件不仅具有基本的进度显示功能,还支持多种颜色自定义和渐变效果。

文章目录

  • 功能概述
  • 控件设计
  • 核心代码解析
    • 初始化方法
    • 动态更新方法
    • 绘制方法
  • 使用示例
  • 总结

功能概述

这个圆形进度条控件的主要功能包括:

  • 自定义颜色:可以分别设置外圆、内圆、进度条渐变起始和结束颜色,以及进度文本的颜色。
  • 动态更新:通过调用 parameterUpdate 方法,可以实时更新进度条的进度值,并自动刷新显示。
  • 渐变效果:进度条支持从起始颜色到结束颜色的渐变效果,使进度条看起来更加美观。
  • 无边框与透明背景:窗口无边框且背景透明,使其可以更好地融入不同的界面设计。

控件设计

这个控件的设计基于 PyQt5 的 QWidget 类,通过重写 paintEvent 方法来实现自定义绘制。以下是控件的主要设计思路:

  • 窗口设置:通过 setWindowFlagssetAttribute 方法,去除窗口边框并设置背景透明。
  • 颜色参数:在初始化时,通过参数传递设置外圆、内圆、进度条渐变颜色和文本颜色。
  • 绘制逻辑:在 paintEvent 方法中,使用 QPainter 对象进行绘制,包括外圆、内圆、进度条和进度文本。
  • 动态更新:通过 parameterUpdate 方法更新进度值,并调用 update 方法触发界面刷新。

核心代码解析

初始化方法

def __init__(self, outer_color="#5F89FF", inner_color="#01224D", 
             progress_color_start="#95BBFF", progress_color_end="#5C86FF", 
             text_color="#5481FF"):
    super(RoundProgress, self).__init__()
    self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框
    self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明
    self.persent = 20  # 初始进度值
    # 设置颜色参数
    self.outer_color = outer_color  # 外圆颜色
    self.inner_color = inner_color  # 内圆颜色
    self.progress_color_start = progress_color_start  # 进度条渐变起始颜色
    self.progress_color_end = progress_color_end  # 进度条渐变结束颜色
    self.text_color = text_color  # 文字颜色
  • 在初始化方法中,设置了窗口的无边框和透明背景属性。
  • 初始化了进度值 persent 和各种颜色参数,这些参数可以通过构造函数进行自定义。

动态更新方法

def parameterUpdate(self, p):
    self.persent = p
    self.update()
  • 这个方法用于更新进度值 persent,并通过调用 update 方法触发界面的重新绘制。

绘制方法

def paintEvent(self, event):
    rotateAngle = 360 * self.persent / 100
    painter = QPainter(self)
    painter.setRenderHints(QtGui.QPainter.Antialiasing)
    painter.setPen(QtCore.Qt.NoPen)
    painter.setBrush(QBrush(QColor(self.outer_color)))
    painter.drawEllipse(10, 10, 120, 120)  # 画外圆
    painter.setBrush(QBrush(QColor(self.inner_color)))
    painter.drawEllipse(12, 12, 116, 116)  # 画内圆
    gradient = QConicalGradient(60, 60, 91)
    gradient.setColorAt(0, QColor(self.progress_color_start))
    gradient.setColorAt(1, QColor(self.progress_color_end))
    self.pen = QPen()
    self.pen.setBrush(gradient)
    self.pen.setWidth(10)
    self.pen.setCapStyle(Qt.RoundCap)
    painter.setPen(self.pen)
    painter.drawArc(QtCore.QRectF(10, 10, 120, 120), (90 - 0) * 16, -rotateAngle * 16)  # 画圆环
    font = QtGui.QFont()
    font.setFamily("Microsoft YaHei")
    font.setPointSize(14)
    painter.setFont(font)
    painter.setPen(QColor(self.text_color))
    painter.drawText(QtCore.QRectF(10, 10, 120, 120), Qt.AlignCenter, "%d%%" % self.persent)
  • 绘制外圆和内圆:使用 QPainterdrawEllipse 方法绘制外圆和内圆。
  • 绘制进度条:使用 QConicalGradient 创建一个圆锥渐变效果,并通过 QPen 设置渐变画刷,然后使用 drawArc 方法绘制圆环。
  • 绘制进度文本:设置字体和颜色,使用 drawText 方法在圆心位置绘制进度百分比文本。

使用示例

以下是使用这个圆形进度条控件的示例代码:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    RoundProgress = RoundProgress()
    RoundProgress.show()
    sys.exit(app.exec_())

运行上述代码后,将显示一个初始进度为 20% 的圆形进度条,可以通过调用 parameterUpdate 方法动态更新进度值,例如:

RoundProgress.parameterUpdate(50)  # 更新进度为 50%

总结

通过上述代码实现了一个功能丰富且美观的圆形进度条控件。它支持多种颜色自定义和渐变效果,能够动态更新进度值,并且具有无边框和透明背景的特性。这种控件可以广泛应用于各种需要进度显示的场景中,为用户界面增添视觉吸引力。

相关文章:

  • 网页五子棋小游戏
  • Promise 全方位解析(图解+实战版)
  • 【弹性计算】弹性裸金属服务器和神龙虚拟化(二):适用场景
  • 控制kinova机械臂沿给定的末端轨迹运动
  • 【银河麒麟高级服务器操作系统】服务器测试业务耗时问题分析及处理全流程分享
  • <tauri><rust><GUI>基于tauri,实现websocket通讯程序(右键菜单、websocket)
  • VSCode 中使用 GitHub Copilot最新版本详解
  • AnyDesk 远程桌面控制软件 v9.0.2
  • latex 环境配置
  • 算法与数据结构(相交链表)
  • MySQL学习笔记(1)索引
  • 超详细,多图文介绍redis集群方式并搭建redis伪集群
  • 《每天搞懂一道Hard》之数独终结者(LeetCode 37)
  • Ubantu22.04系统docker部署Open WebUI+Ollama【教程】
  • 施耐德 PLC 硬件库 DTM 的安装
  • 如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程
  • 大数据与金融科技:革新金融行业的动力引擎
  • Linux(ftrace)__mcount的实现原理
  • 大白话html第六章HTML 与后端交互、优化网页性能
  • 使用UA-SPEECH和TORGO数据库验证自动构音障碍语音分类方法
  • 免费个人网站制作在线/百度seo优化网站
  • 设计好的网站/网站是怎么优化推广的
  • 网站建设小程序公众号推广开发/当日alexa排名查询统计
  • 泰州做房产的网站/代发新闻稿的网站
  • 市区网站建设情况/站长工具ip地址
  • 网站建设充值入口/指数运算法则