介绍
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_()
关键用法解析
基本设置
setRange(min, max):设置进度范围(默认0-100)setValue(value):设置当前进度值setTextVisible(bool):控制是否显示百分比文本(默认显示)
特殊模式
- 不确定进度:
setRange(0, 0)会显示来回滚动的进度条,适合未知时长的任务 - 隐藏进度文本:
setTextVisible(False)
- 不确定进度:
样式自定义
- 通过样式表(QSS)可以修改进度条外观
QProgressBar控制整体样式(边框、高度等)QProgressBar::chunk控制进度块的样式(颜色、宽度等)
线程处理
- 长时间任务必须放在线程中执行,避免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_())
关键用法解析
基本设置
setRange(min, max):设置进度范围(默认0-100)setValue(value):设置当前进度值setTextVisible(bool):控制是否显示百分比文本(默认显示)
特殊模式
- 不确定进度:
setRange(0, 0)会显示来回滚动的进度条,适合未知时长的任务 - 隐藏进度文本:
setTextVisible(False)
- 不确定进度:
样式自定义
- 通过样式表(QSS)可以修改进度条外观
QProgressBar控制整体样式(边框、高度等)QProgressBar::chunk控制进度块的样式(颜色、宽度等)
线程处理
- 长时间任务必须放在线程中执行,避免UI卡顿
- 通过信号(
Signal)从线程向主界面发送进度更新