2016-05-31 196 views
0

感覺就像我應該能夠建立一個事件監聽器來運行AJAX調用來更新qlabel,但這似乎與QT無限複雜。如何更新while循環中的QLabel

基本上我試圖做的是更新QLabel中的文本。這發生在單擊按鈕時出現的無限循環(類似於包含標誌的插槽)。原因是我本質上是在用戶更新的文本文件中讀取。當用戶保存文本文件時,內容會在QLabel上更新。當用戶對文本感到滿意時,他們點擊「發送」。然後殺死聽衆和電子郵件將文本內容轉換爲預定義的電子郵件地址。這是與工作相關的,所以用戶故事已經發生了很大的變化,但總體概念正是我所要做的。

我試圖做類似設置一個標誌,該監聽通過執行以下操作:

while not self.flag_set: 
     self.my_text = text_read_module.get_text(self) 
     self.label_60.setText(self.my_text) 
     QCoreApplication.processEvents() 
     sleep(2) 

我也試圖推動這一到它自己的程序和終止時,含有終止信號的按鈕被稱爲

他們都沒有在屏幕上顯示任何內容,但我可以告訴他們正在運行,感謝一些方便的打印語句

PS這是在Python中完成的,但希望很容易爲C++用戶做好準備

任何想法如何得到這個工作?謝謝!

+0

在主事件循環中調用'processEvents'的用例很少,並且從主線程調用'sleep'通常是一個壞主意。不要一直檢查需要設置的文本,而要使用信號/插槽組合。 –

+0

我通常不是睡眠的支持者,我只是將它用作停止間隙,所以它不會每秒運行100次以上。我肯定喜歡使用信號/插槽組合,我該怎麼做這個用戶故事? –

+0

你沒有'text_read_module'發出信號嗎?它是否是非Qt庫的一部分? –

回答

4

Qt/PyQt中,觸發回調的方法是Signal/Slot系統。通常,如果您需要連續執行某些操作,並且偶爾會根據該操作更新GUI,則可以創建一個工作線程,使用Signals將更新發送回主線程。例如,您可以創建一個工作線程,不斷檢查文件是否有更新,當它檢測到更改時,它可以使用信號將數據發送回主線程。您的主線程GUI會監聽該信號並相應地更新GUI。

幸運的是,在您的情況下,Qt已經有一個名爲QFileSystemWatcher的類,因此您不需要手動創建帶有信號的單獨線程。

class MyWidget(QtGui.QWidget): 

    def __init__(self): 
     super(MyWidget, self).__init__() 
     self.label = QtGui.QLabel(self) 
     self.watcher = QtCore.QFileSystemWatcher(self) 
     self.watcher.addPath('/path/to/file') 
     self.watcher.fileChanged.connect(self.updateLabel) 

    def updateLabel(self, path): 
     with open(path, 'r') as f: 
      self.label.setText(f.read()) 
+0

謝謝,這正是我要去的! –