PyQt GUI操作顺序

Stj*_*pan 2 python user-interface pyqt pyqt4 python-2.7

我有以下问题:

在PyQt中按下按钮后,我必须做两个动作:

  1. 立即更新QTextBrowser
  2. 运行一个等待一段时间的方法,然后启用一些按钮.

我得到的是在等待一段时间后,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)
Run Code Online (Sandbox Code Playgroud)

我尝试了所有的clickStop方法,我尝试使用和不发出updateProgress信号.始终,GUI仅在等待期后刷新.

不过,我以前遇到过这个问题,我想我不明白它是如何与GUI一起工作的.一般来说,如何获得所需的行为:在执行代码行时更新GUI?

thr*_*les 7

在将控制返回到Qt事件循环之前,不会更新/绘制GUI.事件循环在主线程中运行,并且处理与GUI的交互并协调信号/槽系统.

当您在插槽中调用Qt函数时clickStop1(),Qt调用会运行,但GUI不会立即重绘.在这种情况下,控制不会返回到事件循环,直到clickStop()完成运行(也clicked就是处理信号的所有插槽).

您的代码的主要问题是您time.sleep(5)在主线程中有一个阻塞用户的GUI交互以及重绘.您应该缩短插槽的执行时间以维持响应式GUI.

因此我建议你修改,clicked()以便在指定的超时后触发单击QTimer.QTimers不阻止主线程,因此将保持响应性.但是,请注意用户可能同时与GUI交互!在等待QTimer执行时,确保他们不能通过某些用户交互来破坏程序的状态.