PyQT强制更新textEdit再调用其他函数

3

我的问题涉及PyQT5。

我想要一个对话框窗口,其中有一个按钮,当被点击时:

  1. 更新QTextEdit字段的一些文本
  2. 调用一个需要很长时间才能终止的函数

类似于这样:

class StartDialog(QtWidgets.QWidget, start_dialog_ui.Ui_Dialog):
  def __init__(self, parent):
    super(self.__class__, self).__init__()
    self.setupUi(self)
    self.OKButton.clicked.connect(self.start)

 def start(self):
    self.startDialogTextEdit.append("simulation running ...")
    run_lengthy_function(self)

然而,当我运行GUI时,我注意到文本只有在冗长的函数终止之后才会更新,尽管QTextEdit.append在冗长的函数之前被调用。如何强制提前更新文本?
到目前为止我尝试过的(但没有成功)是让Python在触发冗长的函数调用之前等待一段时间。
from time import sleep

class StartDialog(QtWidgets.QWidget, start_dialog_ui.Ui_Dialog):
  def __init__(self, parent):
    super(self.__class__, self).__init__()
    self.setupUi(self)
    self.OKButton.clicked.connect(self.start)

 def start(self):
    self.startDialogTextEdit.append("simulation running ...")
    sleep(5)
    run_lengthy_function(self)
2个回答

6

重新绘制是在事件循环中被调用的,因此睡眠整个线程不会改变任何内容。

您可以通过以下方式手动调用重绘:

self.startDialogTextEdit.repaint()

或调用静态方法:
QCoreApplication.processEvents()

这也意味着它内部会调用repaint方法


1
非常感谢,self.startDialogTextEdit.repaint()按预期工作。 - Amos Egel

2

当文本在 QTextEdit 中显示时,解决方案是调用 qApp.processEvents(),这将强制进行GUI更新:

def start(self):
    self.startDialogTextEdit.append("simulation running ...")
    QtWidgets.qApp.processEvents()
    [...]

另一方面,如果任务很重,则可能会阻止GUI界面,因此解决方案之一是在另一个线程上运行它。我无法给出适当的建议,因为我不知道您的功能。


谢谢,QtWidgets.qApp.processEvents() 对我也有效。同时感谢您提示使用另一个线程。 - Amos Egel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接