Python 设置值后,pyQt进度对话框栏仍为空

Python 设置值后,pyQt进度对话框栏仍为空,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我正在使用一个带有“脉冲”进度条的进度对话框来显示应用程序正在忙于计算。我希望在完成后(接收到完成的信号)立即显示一个填充条,以指示该过程已完成。我已经尝试过类似问题中给出的所有选项(更改值、设置最小/最大值、范围、processEvents等),但进程完成后进度栏仍然为空 下面是一个简单的工作示例。如果在机器中花费的时间太少或太多,可以在运行子例程中更改结束编号 from PyQt4 import QtCore, QtGui import sys class TestDialog(QtGui

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

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

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_())
从PyQt4导入QtCore,QtGui
导入系统
类TestDialog(QtGui.QDialog):
def uuu init uuu(self,parent=None):
super(TestDialog,self)。\uuuu init\uuuuu()
自我调整大小(50,50)
self.Button=QtGui.QPushButton(self)
self.Button.clicked.connect(self.Run\u某物)
self.Button.setText(“运行”)
def运行(自我):
self.progress=QtGui.QProgressDialog(“正在运行”,“取消”,0,0,self)
self.progress.setWindowTitle('请稍候…')
self.progress.setWindowModal(QtCore.Qt.WindowModal)
self.progress.cancelled.connect(self.progress.close)
self.progress.show()
self.TT=测试线程()
self.TT.finished.connect(self.TT\u finished)
self.progress.cancelled.connect(self.progress.close)
self.progress.show()
self.TT.start()
def TT_完成(自):
self.progress.setLabelText(“分析完成”)
self.progress.setRange(0,1)
self.progress.setValue(1)
self.progress.setCancelButtonText(“关闭”)
self.progress.cancelled.connect(self.progress.close)
类测试线程(QtCore.QThread):
finished=QtCore.pyqtSignal()
定义初始化(自):
QtCore.QThread.\uuuu init\uuuuu(self)
def运行(自):
结束=10**7
开始=0
开始<结束时:
开始+=1
self.finished.emit()
self.terminate()
如果“名称”=“\uuuuuuuu主要”:
app=QtGui.QApplication(sys.argv)
Test=TestDialog()
Test.show()
sys.exit(app.exec_())

感谢您的帮助。谢谢

首先,快乐5000号标记了“pyqt”问题:p

关于你的问题。我不知道它为什么这样做,但这里有一个“变通办法”

如果在显示之前将
QProgressDialog
的值设置为其最大值(尽管在此阶段最大值设置为0),则代码正常工作

例如

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


所以,希望这能帮助你继续前进。但我仍然不明白为什么会发生这种事。我想这可能是个bug。

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