2016-07-05 53 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,如果有人尋找那樣的東西 –