设置值后 pyQt 进度对话框保持为空

Posted

技术标签:

【中文标题】设置值后 pyQt 进度对话框保持为空【英文标题】:pyQt progress dialog bar remains empty after value is set 【发布时间】:2015-03-31 11:39:27 【问题描述】:

我正在使用带有“脉冲”进度条的进度对话框来显示应用程序正在忙于计算。我想在完成后立即显示一个实心条(收到完成的信号)以指示该过程已完成。我已经尝试了类似问题中给出的所有选项(更改值、设置最小值/最大值、范围、processEvents 等),但是当过程完成时进度条仍然为空。

下面是一个简单的工作示例。如果在您的机器上花费的时间太少或太多,您可以在 run 子例程中更改结束编号。

from PyQt4 import QtCore, QtGui
import sys

class TestDialog(QtGui.QDialog):
    def __init__(self,parent=None):
        super(TestDialog,self).__init__()
        self.resize(50, 50)
        self.Button = QtGui.QPushButton(self)
        self.Button.clicked.connect(self.Run_Something)
        self.Button.setText("Run")

    def Run_Something(self):
        self.progress = QtGui.QProgressDialog("Running","Cancel",0,0,self) 
        self.progress.setWindowTitle('Please wait...')
        self.progress.setWindowModality(QtCore.Qt.WindowModal)
        self.progress.canceled.connect(self.progress.close)
        self.progress.show()

        self.TT = Test_Thread()
        self.TT.finished.connect(self.TT_Finished)
        self.progress.canceled.connect(self.progress.close)
        self.progress.show()
        self.TT.start()

    def TT_Finished(self):
        self.progress.setLabelText("Analysis finished")
        self.progress.setRange(0,1)
        self.progress.setValue(1)
        self.progress.setCancelButtonText("Close")
        self.progress.canceled.connect(self.progress.close)


class Test_Thread(QtCore.QThread):
    finished = QtCore.pyqtSignal()

    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        end = 10**7
        start = 0        

        while start < end:
            start += 1

        self.finished.emit()
        self.terminate()  

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    Test = TestDialog()
    Test.show()
    sys.exit(app.exec_())

感谢任何帮助。谢谢!

【问题讨论】:

【参考方案1】:

首先,Happy 5000th 标记为“pyqt”问题:P

解决您的问题。我不知道它为什么这样做,但这是一个“解决方法”。

如果您在显示之前将QProgressDialog 的值设置为最大值(尽管在此阶段最大值设置为 0),那么您的代码就可以工作。

例如

self.progress.setValue(1)
self.progress.show()

奇怪的是,如果您不使用上述“修复”而是将范围设置为 0 到 2 之间,那么您的代码确实会在线程结束时成功地将其设置为 50%。但是,尝试将其设置为 100% (setValue(2)) 会导致您观察到的相同错误行为。

所以,希望这可以帮助您继续前进。尽管如此,它为什么会发生仍然让我感到困惑。我认为这可能是一个错误。

【讨论】:

我很高兴我选择了 pyqt 而不仅仅是 pyqt4 :p。这行得通,我对此很满意。显然,进度条无法使用新范围更新。我环顾四周,但找不到更新栏的命令(不重置所有内容)。谢谢你的回答。 我不认为它无法更新范围。我尝试了一个类似的示例,其中范围最初(在实例化时)设置为 0-2。当您更新到最大值 (2) 时,它仍然无法正确显示,但是当您将值设置为中间值 (1) 时成功。 PySide 中也存在这种行为,因此可能是 Qt 错误。 非常感谢,这让我发疯了!

以上是关于设置值后 pyQt 进度对话框保持为空的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 显示全屏对话框

Python PyQt5 对话框元素仅显示 exec_ 而没有显示

3.4 复杂进度对话框

pyQT4本机文件对话框记住最后一个目录

单击文件名时 PyQt5 QFileDialog 关闭

《PyQT5软件开发 - 基础篇》第6章 PyQt5对话框