我希望我的QListWidget
在添加新项目时更新,但只有在功能结束后才会更新所有项目。我尝试过使用update()
和repaint()
,但都没有效果。我实际上不得不在Widget本身使用repaint()
只是为了让它在结束前显示,但没有一个项目。以下是要添加的第一个项目的简要视图:
def runPW10(self):
self.PWList.setVisible(True)
self.PWList.setEnabled(True)
# This repaint() has to be here for even the List to show up
self.PWList.repaint()
....
self.PWList.addItem('Executing Change Password Tool')
# This does not help
self.PWList.repaint()
....
该功能还有更多功能,但它很长,应该包括它所需要的功能。如果需要更多,请告诉我。
我做错了什么导致这个List没有随着项目的添加而更新?
答案 0 :(得分:4)
添加QApplication.processEvents()
。
QCoreApplication.processEvents (QEventLoop.ProcessEventsFlags flags = QEventLoop.AllEvents)
根据指定的标志处理调用线程的所有挂起事件,直到没有其他事件要处理。
当程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此功能。
您的小部件最初将显示但无响应。要使应用程序具有响应性,请在添加项目时向某些人添加processEvents()
次调用。
请记住,这会影响的性能。这允许整个应用程序循环执行,包括任何排队的事件。 不要 将此添加到性能敏感的循环中。
还要考虑这允许您的用户与应用程序进行交互,因此请确保不允许任何可能发生的交互,例如somebutton.enabled(False)
,或者正常处理,例如Cancel
按钮停止长任务。
有关详细信息,请参阅original C++ docs,因为pyqt
是直接端口。
答案 1 :(得分:2)
在这一点上完成Drise的答案:
还要考虑这允许您的用户与应用程序进行交互,因此请确保不允许任何可能发生的交互,例如
somebutton.enabled(False)
,或者正常处理,例如Cancel
按钮停止长任务。
您可能希望以这种方式使用QEventLoop.ExcludeUserInputEvents
标志:QCoreApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
来刷新GUI,同时阻止用户激活任何小部件。
QEventLoop.ExcludeUserInputEvents
0x01
请勿处理用户输入事件,例如
ButtonPress
和KeyPress
。请注意,事件不会被丢弃;它们将在下次没有processEvents()
标志的情况下调用ExcludeUserInputEvents
时发送。