首先,直接编辑使用QtDesigner创建的代码是一个坏主意。您可能已经
# WARNING! All changes made in this filewill be lost!在文档顶部看到该行。对于这样一个简单的小部件,最好使用手动编码。
其次,仔细研究该
action插槽的实际功能。
def action(self): self.pb.setRange(0, 0) # Un sleep(3) # <-- Your slot blocks HERE self.pb.setRange(0, 100) self.pb.setValue(100) QtGui.qApp.processEvents()
当您的插槽被封锁时,您的progressBar没有理由更新其值
sleep。当
action被调用时,所述槽线程休眠3秒然后设置进度条整整100。
您不能指望progressBar在任务运行时神奇地自我更新。如果您不知道需要多长时间,又不能分步进行细分,则应考虑使用 脉冲式
ProgressBar(请参见下面的示例1)。如果您可以轻松获得任务的进度(例如复制n个文件),则应相应地更新progressBar的值。
无论哪种方式,您都应该使用
QThread非阻塞行为,并
signals在您的线程和主应用程序之间进行通信。
- 主应用程序启动QThread来实现长时间运行的任务。
- QThread向主应用程序通知任务进度(如果可用)或完成
示例1-Pulse ProgressBar:
如果最小值和最大值都设置为0,则进度条将显示忙碌指示器,而不是步骤百分比。
class MyCustomWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyCustomWidget, self).__init__(parent) layout = QtGui.QVBoxLayout(self) # Create a progress bar and a button and add them to the main layout self.progressBar = QtGui.QProgressBar(self) self.progressBar.setRange(0,1) layout.addWidget(self.progressBar) button = QtGui.QPushButton("Start", self) layout.addWidget(button) button.clicked.connect(self.onStart) self.myLongTask = TaskThread() self.myLongTask.taskFinished.connect(self.onFinished) def onStart(self): self.progressBar.setRange(0,0) self.myLongTask.start() def onFinished(self): # Stop the pulsation self.progressBar.setRange(0,1)class TaskThread(QtCore.QThread): taskFinished = QtCore.pyqtSignal() def run(self): time.sleep(3) self.taskFinished.emit()
示例2-经典ProgressBar:
class MyCustomWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyCustomWidget, self).__init__(parent) layout = QtGui.QVBoxLayout(self) self.progressBar = QtGui.QProgressBar(self) self.progressBar.setRange(0,100) button = QtGui.QPushButton("Start", self) layout.addWidget(self.progressBar) layout.addWidget(button) button.clicked.connect(self.onStart) self.myLongTask = TaskThread() self.myLongTask.notifyProgress.connect(self.onProgress) def onStart(self): self.myLongTask.start() def onProgress(self, i): self.progressBar.setValue(i)class TaskThread(QtCore.QThread): notifyProgress = QtCore.pyqtSignal(int) def run(self): for i in range(101): self.notifyProgress.emit(i) time.sleep(0.1)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)