python pyside2 Progress Bar进度条(QProgressBar)

需要掌握:
python pyside2 QThread线程

介绍

QProgressBar 是 PySide2 中用于显示进度的控件,常用于文件加载、任务处理等需要展示进度的场景。以下是其详细用法和示例:

应用场景

  • 文件上传/下载进度显示
  • 数据处理进度展示
  • 程序启动加载进度
  • 长时间运算的进度反馈

使用注意

进度条的更新频率不宜过高(一般100ms一次即可),以免影响性能。对于不确定时长的任务,使用不确定模式能给用户更好的体验。

例子


from PySide2.QtCore import *
from PySide2.QtWidgets import *
import sys,os,time
import PySide2


dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        if not Dialog.objectName():
            Dialog.setObjectName(u"Dialog")
        Dialog.resize(617, 66)
        self.verticalLayout = QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.progressBar = QProgressBar(Dialog)
        self.progressBar.setObjectName(u"progressBar")
        self.progressBar.setRange(0, 100)  # 设置进度范围(最小值, 最大值)
        self.progressBar.setValue(0)  # 设置初始值

        self.verticalLayout.addWidget(self.progressBar)


        self.retranslateUi(Dialog)

        QMetaObject.connectSlotsByName(Dialog)
        self.run_on_start()
    # setupUi

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))
    # retranslateUi
    def run_on_start(self):
        """启动时自动执行的任务"""

        # 启动后台线程执行耗时任务
        self.thread = ProgressThread()
        # 执行时更新进度条
        self.thread.progress_updated.connect(self.progressBar.setValue)
        # 执行完成时执行的函数
        self.thread.finished.connect(self.task_finished)
        # 启动线程
        self.thread.start()

    def task_finished(self):
        print("执行完成")

class ProgressThread(QThread):
    progress_updated = Signal(int)  # 用于发送进度信号

    def run(self):
        for i in range(1,101):
            self.progress_updated.emit(i)  # 发送当前进度
            time.sleep(0.05)  # 模拟任务耗时



if __name__ == "__main__":
  app = QApplication(sys.argv)
  form = QWidget()
  uiform = Ui_Dialog()  # 该类是生成的类名
  uiform.setupUi(form)
  form.show()
  app.exec_()

关键用法解析

  1. 基本设置

    • setRange(min, max):设置进度范围(默认0-100)
    • setValue(value):设置当前进度值
    • setTextVisible(bool):控制是否显示百分比文本(默认显示)
  2. 特殊模式

    • 不确定进度:setRange(0, 0) 会显示来回滚动的进度条,适合未知时长的任务
    • 隐藏进度文本:setTextVisible(False)
  3. 样式自定义

    • 通过样式表(QSS)可以修改进度条外观
    • QProgressBar 控制整体样式(边框、高度等)
    • QProgressBar::chunk 控制进度块的样式(颜色、宽度等)
  4. 线程处理

    • 长时间任务必须放在线程中执行,避免UI卡顿
    • 通过信号(Signal)从线程向主界面发送进度更新

复杂例子

import sys
import time
from PySide2.QtWidgets import (QApplication, QWidget, QVBoxLayout, 
                               QProgressBar, QPushButton, QLabel)
from PySide2.QtCore import QThread, Signal, Qt

# 进度更新线程(避免UI卡顿)
class ProgressThread(QThread):
    progress_updated = Signal(int)  # 用于发送进度信号

    def run(self):
        for i in range(101):
            self.progress_updated.emit(i)  # 发送当前进度
            time.sleep(0.05)  # 模拟任务耗时

class ProgressBarDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建垂直布局
        layout = QVBoxLayout()
        layout.setSpacing(20)

        # 1. 基本进度条
        self.label1 = QLabel("基本进度条:")
        self.progress1 = QProgressBar()
        self.progress1.setRange(0, 100)  # 设置进度范围(最小值, 最大值)
        self.progress1.setValue(0)       # 设置初始值

        # 2. 带文本显示的进度条
        self.label2 = QLabel("带百分比的进度条:")
        self.progress2 = QProgressBar()
        self.progress2.setRange(0, 100)
        self.progress2.setValue(0)
        self.progress2.setTextVisible(True)  # 显示百分比文本

        # 3. 自定义样式的进度条
        self.label3 = QLabel("自定义样式进度条:")
        self.progress3 = QProgressBar()
        self.progress3.setRange(0, 100)
        self.progress3.setValue(0)
        self.progress3.setStyleSheet("""
            QProgressBar {
                border: 2px solid grey;
                border-radius: 5px;
                text-align: center;
                height: 15px;
            }
            QProgressBar::chunk {
                background-color: #0078d7;  /* Windows 10 蓝色 */
                width: 10px;
                margin: 0.5px;
            }
        """)

        # 4. 不确定进度(用于未知时长的任务)
        self.label4 = QLabel("不确定进度:")
        self.progress4 = QProgressBar()
        self.progress4.setRange(0, 0)  # 范围设置为(0,0)表示不确定进度

        # 开始按钮
        self.start_btn = QPushButton("开始任务")
        self.start_btn.clicked.connect(self.start_task)

        # 添加控件到布局
        layout.addWidget(self.label1)
        layout.addWidget(self.progress1)
        layout.addWidget(self.label2)
        layout.addWidget(self.progress2)
        layout.addWidget(self.label3)
        layout.addWidget(self.progress3)
        layout.addWidget(self.label4)
        layout.addWidget(self.progress4)
        layout.addWidget(self.start_btn)

        self.setLayout(layout)

        # 窗口设置
        self.setWindowTitle('QProgressBar 用法示例')
        self.setGeometry(300, 300, 400, 300)
        self.show()

    def start_task(self):
        # 禁用按钮防止重复点击
        self.start_btn.setEnabled(False)

        # 创建并启动进度线程
        self.thread = ProgressThread()
        self.thread.progress_updated.connect(self.update_progress)
        self.thread.finished.connect(self.task_finished)  # 任务完成后恢复按钮
        self.thread.start()

    def update_progress(self, value):
        # 更新所有进度条
        self.progress1.setValue(value)
        self.progress2.setValue(value)
        self.progress3.setValue(value)

    def task_finished(self):
        # 恢复按钮状态
        self.start_btn.setEnabled(True)
        # 重置不确定进度条
        self.progress4.setRange(0, 100)
        self.progress4.setValue(100)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ProgressBarDemo()
    sys.exit(app.exec_())

关键用法解析

  1. 基本设置

    • setRange(min, max):设置进度范围(默认0-100)
    • setValue(value):设置当前进度值
    • setTextVisible(bool):控制是否显示百分比文本(默认显示)
  2. 特殊模式

    • 不确定进度:setRange(0, 0) 会显示来回滚动的进度条,适合未知时长的任务
    • 隐藏进度文本:setTextVisible(False)
  3. 样式自定义

    • 通过样式表(QSS)可以修改进度条外观
    • QProgressBar 控制整体样式(边框、高度等)
    • QProgressBar::chunk 控制进度块的样式(颜色、宽度等)
  4. 线程处理

    • 长时间任务必须放在线程中执行,避免UI卡顿
    • 通过信号(Signal)从线程向主界面发送进度更新

原文出处:/show_1GW1rlopNlG4.html