实现三个按钮控制一个进度条分别显示不同的进度
import time
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar, QVBoxLayout, QWidget
from PySide6.QtCore import Qt, QThread, Signal
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Progress Bar Example")
# 创建一个QWidget实例
central_widget = QWidget()
layout = QVBoxLayout(central_widget)
self.button1 = QPushButton("Start Progress 50", self)
# 任务一的进度条最大值为 50
self.button1.clicked.connect(lambda: self.start_progress(50))
self.button2 = QPushButton("Start Progress 30", self)
# 任务一的进度条最大值为 30
self.button2.clicked.connect(lambda: self.start_progress(30))
self.button3 = QPushButton("Start Progress 44", self)
# 任务一的进度条最大值为 44
self.button3.clicked.connect(lambda: self.start_progress(44))
self.progress = QProgressBar(self)
self.progress.setAlignment(Qt.AlignHCenter)
self.progress.hide() # 初始时设置进度条为隐藏状态
layout.addWidget(self.button1)
layout.addWidget(self.button2)
layout.addWidget(self.button3)
layout.addWidget(self.progress)
# 将QWidget实例设置为centralWidget
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def start_progress(self, max_value):
self.progress.setValue(0)
self.progress.setMaximum(max_value) # 设置进度条的最大值
self.progress.show() # 当按钮被点击时,显示进度条
for i in range(max_value):
self.progress.setValue(i+1)
time.sleep(0.005)
self.progress.hide()
def update_progress(self, value):
self.progress.setValue(value)
def hide_progress(self):
self.progress.hide() # 隐藏进度条
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
上面的代码,有一个缺陷,如果大量复杂工作在按钮的点击事件槽函数中执行的话,那么有可能造成程序界面响应失效。针对这个问题,可以通过自定义信号和槽来解决,以下是具体的实现:
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar, QVBoxLayout, QWidget
from PySide6.QtCore import Qt, QThread, Signal
class Worker(QThread):
progress = Signal(int)
def __init__(self):
super().__init__()
self.max_value = 100
def set_max_value(self, max_value):
self.max_value = max_value
def run(self):
for i in range(self.max_value + 1):
self.progress.emit(i)
self.msleep(10)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Progress Bar Example")
# 创建一个QWidget实例
central_widget = QWidget()
layout = QVBoxLayout(central_widget)
self.button1 = QPushButton("Start Progress 50", self)
self.button1.clicked.connect(lambda: self.start_progress(50))
self.button2 = QPushButton("Start Progress 30", self)
self.button2.clicked.connect(lambda: self.start_progress(30))
self.button3 = QPushButton("Start Progress 44", self)
self.button3.clicked.connect(lambda: self.start_progress(44))
self.progress = QProgressBar(self)
self.progress.setAlignment(Qt.AlignHCenter)
self.progress.hide() # 初始时设置进度条为隐藏状态
layout.addWidget(self.button1)
layout.addWidget(self.button2)
layout.addWidget(self.button3)
layout.addWidget(self.progress)
# 将QWidget实例设置为centralWidget
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def start_progress(self, max_value):
self.progress.setMaximum(max_value) # 设置进度条的最大值
self.progress.show() # 当按钮被点击时,显示进度条
self.worker = Worker()
self.worker.set_max_value(max_value) # 设置最大值
self.worker.progress.connect(self.update_progress)
self.worker.finished.connect(self.hide_progress) # 当进度完成时,隐藏进度条
self.worker.start()
def update_progress(self, value):
self.progress.setValue(value)
def hide_progress(self):
self.progress.hide() # 隐藏进度条
app = QApplication([])
window = MainWindow()
window.show()
app.exec()