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

时间:2015-03-31 11:39:27

标签: python pyqt pyqt4

我正在使用带有“脉冲”进度条的进度对话框来显示应用正在忙于计算。我希望一旦完成(收到完成的信号)就显示一个填充栏,表示该过程已完成。我已经尝试了类似问题中给出的所有选项(更改值,设置最小值/最大值,范围,进程事件等),但进程完成后进度条保持为空。

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

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 个答案:

答案 0 :(得分:1)

首先,Happy 5000th标记为&#34; pyqt&#34;问题:P

关于你的问题。我不知道为什么会这样做,但这是一个&#34;解决方法&#34;。

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

E.g。

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

奇怪的是,如果你不使用上述&#34;修复&#34;但是将范围设置为介于0和2之间,然后您的代码在线程结束时成功将其设置为50%。但是,尝试将其设置为100%(setValue(2))会导致您观察到的相同错误行为。

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