PyQt5 – 试管式进度条

  • Post category:Python

下面是Python的“PyQt5 – 试管式进度条”使用攻略。

简介

PyQt5是Python的GUI工具包,以Qt实现,支持多平台。试管式进度条是一种优雅的UI设计,它通过管道中液体的变化来展示进度。这种进度条在用户感官上有极佳的体验感。PyQt5可以轻松实现试管式进度条的效果。

实现方法

在PyQt5中,试管式进度条的实现方法基于QProgressBar,主要需要进行如下操作:

  1. 设置QProgressBar的样式为QStyleFactory.create(),该方法会根据当前系统环境决定样式。而PyQt5中的QProxyStyle则是QStyle的一个代理类,可以让QStyle中许多细节变得方便易用,例如带背景图片的进度条和试管式进度条等;

  2. 启用QProgressBar的动画模式,使进度条呈现出流动液体的效果。这里采用setValue()方法周期性的更新QProgressBar的进度值来制造出液体移动的效果;

  3. 通过CSS中的QProgressBar::chunk属性对进度条的样式进行自定义,包括填充颜色、背景颜色等。

示例说明

下面将通过两个示例来演示PyQt5中如何实现试管式进度条。

示例1

该示例中,我们将创建一个主窗口,包含两个分别代表98%和50%的进度条。

from PyQt5.Qt import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(200, 200, 400, 300)
        self.initUI()

    def initUI(self):
        # 创建QProgressBar
        self.progress_bar1 = QProgressBar(self)
        self.progress_bar1.setGeometry(60, 60, 200, 37)
        self.progress_bar1.setRange(0, 100)
        self.progress_bar1.setStyleSheet('QProgressBar{border: 2px solid grey; border-radius: 10px; color: black;} QProgressBar::chunk{background-color: forestgreen;}')
        # 设置QProgressBar的样式为试管样式
        self.progress_bar1.setStyle(QProxyStyle())
        # 设置QProgressBar的动画效果
        self.timer1 = QTimer(self)
        self.timer1.timeout.connect(self.move_progress_bar1)
        self.timer1.start(100)

        # 创建QProgressBar
        self.progress_bar2 = QProgressBar(self)
        self.progress_bar2.setGeometry(60, 140, 200, 37)
        self.progress_bar2.setRange(0, 100)
        self.progress_bar2.setStyleSheet('QProgressBar{border: 2px solid grey; border-radius: 10px; color: black;} QProgressBar::chunk{background-color: darkorange;}')
        # 设置QProgressBar的样式为试管样式
        self.progress_bar2.setStyle(QProxyStyle())
        # 设置QProgressBar的动画效果
        self.timer2 = QTimer(self)
        self.timer2.timeout.connect(self.move_progress_bar2)
        self.timer2.start(100)

    # 移动QProgressBar1的进度
    def move_progress_bar1(self):
        value = self.progress_bar1.value() + 1
        if value > 98:
            value = 0
        self.progress_bar1.setValue(value)

    # 移动QProgressBar2的进度
    def move_progress_bar2(self):
        value = self.progress_bar2.value() + 1
        if value > 50:
            value = 0
        self.progress_bar2.setValue(value)

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在上述代码中,我们通过setStyleSheet()方法自定义了两个进度条的颜色,实现了试管的颜色效果。值得一提的是,我们通过setStyle()方法将进度条的样式设置为了试管样式,这时进度条的外观就会变成试管的形状。我们通过启动两个计时器周期性地调用move_progress_bar1()和move_progress_bar2()方法来移动两个进度条的进度。

示例2

该示例中,我们将创建一个进度条对话框并实现动态展示的效果。

from PyQt5.Qt import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class ProgressDialog(QProgressDialog):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建QProgressBar
        self.progress_bar1 = QProgressBar(self)
        self.progress_bar1.setGeometry(50, 40, 200, 37)
        self.progress_bar1.setRange(0, 100)
        self.progress_bar1.setStyleSheet('QProgressBar{border: 2px solid grey; border-radius: 10px; color: black;} QProgressBar::chunk{background-color: dodgerblue;}')
        # 设置QProgressBar的样式为试管样式
        self.progress_bar1.setStyle(QProxyStyle())

        # 设置对话框标题和样式
        self.setWindowTitle('Example')
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setStyleSheet('QProgressDialog{background-color: white; border: 2px solid grey;}')

        # 设置QProgressDialog的值
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.move_progress_bar)
        self.timer.start(100)

    # 移动进度条的进度
    def move_progress_bar(self):
        value = self.progress_bar1.value() + 1
        if value > 100:
            self.close()
        else:
            self.progress_bar1.setValue(value)

if __name__ == '__main__':
    app = QApplication([])
    dialog = ProgressDialog()
    dialog.exec_()

在上述代码中我们创建了一个ProgressDialog类,它继承自QProgressDialog类。通过setWindowFlags()方法设置QProgressDialog的样式为无边框,然后通过setStyleSheet()方法为其设置白色背景和灰色的边框。我们同样通过setStyle()方法将QProgressBar的样式设置为了试管样式,之后调用计时器周期性调用move_progress_bar()方法来移动进度条的进度,从而实现了动态展示效果。

以上就是PyQt5中如何实现试管式进度条的完整攻略了。