PyQt GUI 操作顺序

PyQt GUI order of operations

我有以下问题:

在 PyQt 制作的 GUI 中按下按钮后,我必须执行两个操作:

  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)

我在一个 clickStop 方法中尝试了所有方法,我尝试了发出和不发出 updateProgress 信号。始终,仅在等待期后刷新 GUI。

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

在控制 return 到 Qt 事件循环之前,GUI 不会 updated/drawn。事件循环在主线程中运行,处理与 GUI 的交互并协调 signals/slot 系统。

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

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

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