如何在函数结束之前将项目显示在我的QListWidget中?

时间:2018-03-16 17:56:45

标签: python pyqt pyqt4

我希望我的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没有随着项目的添加而更新?

2 个答案:

答案 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

     

请勿处理用户输入事件,例如ButtonPressKeyPress。请注意,事件不会被丢弃;它们将在下次没有processEvents()标志的情况下调用ExcludeUserInputEvents时发送。