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

Posted

技术标签:

【中文标题】PyQT 在调用其他函数之前强制更新 textEdit【英文标题】:PyQT force update textEdit before calling other function 【发布时间】:2017-12-05 13:04:07 【问题描述】:

我的问题涉及 PyQT5。 我尝试有一个带有按钮的对话框窗口,当点击时

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

类似这样的:

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)

【问题讨论】:

【参考方案1】:

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

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

self.startDialogTextEdit.repaint()

或者调用静态方法:

QCoreApplication.processEvents()

内部也调用重绘

【讨论】:

非常感谢,self.startDialogTextEdit.repaint() 可以正常工作。【参考方案2】:

QTextEdit中显示文字的解决方法是调用qApp.processEvents(),这对GUI的更新强制:

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

另一方面,如果任务很重,它可能会阻塞 GUI,所以也许一个解决方案是在另一个线程上运行它,我无法给出正确的建议,因为我不知道你的功能

【讨论】:

谢谢,QtWidgets.qApp.processEvents() 也适用于我。也感谢您使用另一个线程的提示。

以上是关于PyQT 在调用其他函数之前强制更新 textEdit的主要内容,如果未能解决你的问题,请参考以下文章

如何在函数内部强制 COMMIT 以便其他会话可以看到更新的行?

强制 attr 更新后 JQuery html() 调用不返回值

更新 PyQT 标签

PyQt 5 QTableView 选择栏问题

在另一个函数之前强制 setState

jQuery:强制执行 document.ready() 调用的顺序