PyQt GUI操作顺序

时间:2015-04-28 10:06:15

标签: python python-2.7 user-interface pyqt pyqt4

我遇到以下问题:

按下PyQt制作的GUI按钮后,我必须做两个动作:

  1. 立即更新QTextBrowser
  2. 运行一个等待一段时间的方法,然后启用一些按钮。
  3. 我得到的是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?

1 个答案:

答案 0 :(得分:7)

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

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

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

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