python pyside2 Progress Bar进度条(QProgressBar) 作者:马育民 • 2025-09-15 15:54 • 阅读:10000 需要掌握: [python pyside2 QThread线程](https://www.malaoshi.top/show_1GW1rlplwTIE.html "python pyside2 QThread线程") # 介绍 `QProgressBar` 是 PySide2 中用于显示进度的控件,常用于文件加载、任务处理等需要展示进度的场景。以下是其详细用法和示例: # 例子 ``` 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_() ``` # 复杂例子 ``` 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`)从线程向主界面发送进度更新 ### 常用场景 - 文件上传/下载进度显示 - 数据处理进度展示 - 程序启动加载进度 - 长时间运算的进度反馈 使用时需注意,进度条的更新频率不宜过高(一般100ms一次即可),以免影响性能。对于不确定时长的任务,使用不确定模式能给用户更好的体验。 原文出处:http://www.malaoshi.top/show_1GW1rlopNlG4.html