📜  PyQt5 - 多色边框进度条(1)

📅  最后修改于: 2023-12-03 15:03:56.080000             🧑  作者: Mango

PyQt5 - 多色边框进度条

本文将介绍如何使用 PyQt5 创建一个多色边框的进度条。

PyQt5 简介

PyQt5 是一个流行的 Python GUI 框架,用于创建漂亮且具有相应功能的应用程序。它是 PyQt 的最新版本,支持 Qt5 所有功能以及 PyQt 常用的特性。

多色边框进度条的实现

实现本程序需要以下库:

from PyQt5.QtCore import Qt, QPropertyAnimation, QTimer, QRect, QSize
from PyQt5.QtGui import QPainter, QColor, QFont, QPen
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar

下面是程序的主要部分。

class BorderProgressBar(QProgressBar):
    def __init__(self, parent):
        super(BorderProgressBar, self).__init__(parent)
        
        # 设置动画、字体、刻度线等
        self.animation = QPropertyAnimation(self, b"value")
        self.animation.setDuration(1000)
        
        self.timer = QTimer(self)
        self.timer.timeout.connect(self._update)
        
        self.setStyleSheet('QProgressBar::chunk {background-color: red;}')
        
        font = QFont()
        font.setPointSize(10)
        self.setFont(font)
        self.setAlignment(Qt.AlignCenter)
        
        self.setFormat("0%")
        self.setMinimum(0)
        self.setMaximum(100)
        
    def start(self, duration):
        self.animation.setStartValue(0)
        self.animation.setEndValue(100)
        self.animation.start()
    
        self.timer.start(duration // 100)
        
    def _update(self):
        value = self.animation.currentValue()
        self.setFormat(f"{value}%")
        self.update()
        
        if not self.animation.running():
            self.timer.stop()
        
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        
        # 绘制进度条底色
        rect = QRect(0, 0, self.width() - 1, self.height() - 1)
        painter.setPen(QPen(QColor(128, 128, 128)))
        painter.drawRect(rect)
        
        # 绘制进度条颜色
        value = self.animation.currentValue()
        fraction = value / 100
        
        rect = QRect(0, 0, (self.width() - 1) * fraction, self.height() - 1)
        gradient = QLinearGradient(rect.topLeft(), rect.topRight())
        gradient.setColorAt(0, QColor(230, 230, 230))
        gradient.setColorAt(0.5, QColor(128, 128, 128))
        gradient.setColorAt(1, QColor(230, 230, 230))
        painter.setBrush(QColor(128, 128, 128))
        painter.drawRect(rect)
        
        # 绘制进度条边框
        painter.setPen(QPen(QColor(0, 162, 232), 2))
        painter.setBrush(Qt.NoBrush)
        painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
        
        painter.end()

程序的核心是绘制 QProgressBar 的外边框,进度条底色和进度条颜色。我们使用 paintEvent 方法绘制控件,使用 QPropertyAnimationQTimer 控制进度条颜色变化和动画。

程序演示
if __name__ == '__main__':
    app = QApplication([])
    window = QWidget()
    window.setFixedSize(300, 60)
    
    progress_bar = BorderProgressBar(window)
    progress_bar.setGeometry(20, 20, 260, 20)
    
    window.show()
    
    progress_bar.start(5000)
    
    app.exec_()

运行程序,可以看到进度条按照预定的时间从 0 变化到 100。

程序演示效果如下:

多色边框进度条

总结

本文介绍了如何使用 PyQt5 创建一个多色边框的进度条。我们使用了 QPropertyAnimationQTimer 控制进度条颜色变化和动画,以及 paintEvent 方法绘制整个进度条。

代码已上传至 Github