我遇到以下问题:
按下PyQt制作的GUI按钮后,我必须做两个动作:
我得到的是1和2在等待一段时间后同时完成。
部分代码是:
#in the signals definition...
signalUpdateProgressDialog = QtCore.pyqtSignal(str) # signal definition
#in the connections definition...
self.btnStopOpt.clicked.connect(self.clickStop1)
self.btnStopOpt.clicked.connect(self.clickStop)
def updateProgressDialog(self, dialog):
self.ProgressDialog.setHtml(dialog)
def clickStop1(self):
# notify
self.signalUpdateProgressDialog.emit('Message')
def clickStop(self):
# shut down thread...
print "Thread Stopped"
time.sleep(5)
# enable run button
self.btnRun.setEnabled(True)
我在一个clickStop方法中尝试了所有方法,我尝试使用和不使用为updateProgress发出信号。始终,GUI仅在等待期后刷新。
然而,之前我遇到过这个问题,我想我不明白它如何与GUI一起工作。一般来说,如何获得所需的行为:在执行代码行时更新GUI?
答案 0 :(得分:7)
在将控件返回到Qt事件循环之前,不会更新/绘制GUI。事件循环在主线程中运行,处理与GUI的交互并协调信号/槽系统。
当您在clickStop1()
这样的插槽中调用Qt函数时,Qt调用会运行,但GUI不会立即重绘。在这种情况下,控件不会返回到事件循环,直到clickStop()
完成运行(同时处理clicked
信号的所有插槽。
您的代码的主要问题是主线程中有time.sleep(5)
,它阻止了用户的GUI交互以及重绘。您应该缩短插槽的执行时间以维持响应式GUI。
因此我建议您修改clicked()
,以便在指定的超时后触发singleshot QTimer
。 QTimer
不阻止主线程,因此将保持响应性。但是,请注意用户可能同时与GUI交互!在等待QTimer
执行时,确保他们不会通过某些用户交互来破坏程序的状态。