带有PyQt进度条的忙碌指示

带有PyQt进度条的忙碌指示,第1张

带有PyQt进度条的忙碌指示

首先,直接编辑使用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)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5644819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存