PyQt4:仅处理最后一个信号

时间:2016-07-05 15:39:51

标签: python pyqt4

我在处理项目时遇到了一个奇怪的问题。我有一个GUI和一个QTextEdit作为状态浏览器。单击一个按钮时,我希望QTextEdit显示10秒倒计时,而另一个函数在单独的线程中发生。即使我每秒发出一个信号,QTextEdit也会挂起9秒钟,然后显示最后一个倒计时数字。

我认为这可能与在单独的线程中发生的事情有关,所以我创建了一个单独的示例来测试它。在我的简单示例中,有两件事:QTextEdit和Button。单击该按钮时,状态浏览器应显示“' 5'两秒钟,然后' 4'。

以下是代码:

import sys
from PyQt4 import QtGui, uic
from PyQt4.QtCore import QObject, pyqtSignal
import time

class MainUI(QObject):
    status_signal = pyqtSignal(str)

    def __init__(self, window):
        super(QObject, self).__init__()
        self.ui = uic.loadUi(r'L:\internal\684.07\Mass_Project\Software\PythonProjects\measure\testing\status_test.ui', window)

        self.ui.statusBrowser.setReadOnly(True)
        self.ui.statusBrowser.setFontPointSize(20)

        self.status_signal.connect(self.status_slot)
        self.ui.button.clicked.connect(self.counter)

        window.show()

    def status_slot(self, message):
        self.ui.statusBrowser.clear()
        self.ui.statusBrowser.append(message)

    def counter(self):
        print 'clicked'
        i = 5
        self.status_signal.emit(str(i))
        time.sleep(2)
        self.status_signal.emit(str(i-1))


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    app.setStyle("cleanlooks")
    main_window = QtGui.QDialog()
    main_ui = MainUI(main_window)
    sys.exit(app.exec_())

在这个例子中,同样的事情发生了。状态浏览器会挂起2秒钟,然后才会显示“' 4”。当我更改status_slot功能以便在添加状态浏览器之前不清除状态浏览器时,状态浏览器会等待2秒钟,然后立即发出两个信号,显示' 5 \ n 4&#39 ;.有谁知道为什么会这样,我可以做些什么来不断更新显示?提前谢谢!

1 个答案:

答案 0 :(得分:1)

time.sleep()阻止Qt主循环,以便它不能处理窗口重绘事件。使用QTimer定期调用发出信号的方法,以便定期将控制权返回给Qt事件循环。