PyQT 在调用其他函数之前强制更新 textEdit

Amo*_*gel 3 python pyqt pyqt5

我的问题涉及 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)
Run Code Online (Sandbox Code Playgroud)

然而,当我运行 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)
Run Code Online (Sandbox Code Playgroud)

Eri*_*tný 6

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

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

self.startDialogTextEdit.repaint()
Run Code Online (Sandbox Code Playgroud)

或调用静态方法:

QCoreApplication.processEvents()
Run Code Online (Sandbox Code Playgroud)

内部也调用 repaint