2012-08-06 101 views
0

我有以下幾點:Pyside的setText()不更新QLabel

self.testTxt = QtGui.QLabel("0") 
. 
. 
for i in range(10): 
     sleep(1) 
     self.testTxt.setText(unicode(i)) 

但QLabel沒有更新,直到循環結束

我已經試過:

self.processEvents() 
self.testTxt.update() 

但無濟於事。

有人碰巧知道爲什麼嗎?

在此先感謝

+0

您需要使用QThread的。如果沒有其他人,我會盡量寫一個例子。 – Jeff 2012-08-06 22:25:14

+0

..或者更簡單一點,QTimer。 – 2012-08-06 22:32:04

+0

如果我使用Qtimer作爲外部函數,Qtimer不再更新一次我進入主循環... – georges 2012-08-07 20:30:41

回答

2

文本框不更新,因爲程序捆綁裏面的for循環,因此永遠不會回來Qt的事件循環重繪的部件。調用testTxt.update()並沒有幫助,因爲如QWidget documentation所述,更新()只需時間表爲下一次運行事件循環(並且無論如何調用setText時都要考慮這一點)重新繪製。

可能的解決方案:

  • 使用QTimer進行重複調用,更新每次調用後的文本(這是首選的解決方案)
  • 調用testText.repaint()函數來的setText
  • 調用QApplication.processEvents()每次調用後的setText
+0

如果我使用Qtimer作爲外部函數,Qtimer不再更新,一旦我進入主循環。 .. – georges 2012-08-07 20:30:05

+0

正確,出於完全相同的原因 - Qt事件循環負責驅動QTimer,並且直到您的函數退出纔會發生。所以這個想法是你的函數應該只更新一次標籤(它不應該進行多次更新或者打電話進入休眠狀態)。而是使用QTimer每秒調用一次更新函數。如果這仍然令人困惑,那麼您應該閱讀關於QTimer的內容,並查看一些如何使用QTimer的示例。 – Luke 2012-08-07 21:37:52