【问题标题】:PyQt GUI order of operationsPyQt GUI 操作顺序
【发布时间】:2015-07-07 02:58:51
【问题描述】:

我有以下问题:

在 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)

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多