2012-08-06 233 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