2016-07-05 50 views
0

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

我认为这可能与事情发生在一个单独的线程有关,所以我创建了一个单独的例子来测试。在我的简单例子中,有两件事:一个QTextEdit和一个按钮。点击按钮后,状态浏览器应显示“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”。有谁知道为什么会发生这种情况,我能做些什么来不断更新显示?提前致谢!

回答

1

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

+0

谢谢!我尝试过使用它,它可以更新状态浏览器。由于我想在状态浏览器倒计时的时候延迟这个线程,所以我还遇到了类似于'time.sleep(sec)'的'QTest.qWait(msec)',但是不冻结GUI,如果有人寻找那样的东西 –