如何在 GUI 线程之外使用 QProgressBar.setValue.重绘错误



我使用 PyQt 来显示检测结果。我有两个线程,一个Ui_MainWindow ui 和一个 QThread 检测。我得到了检测结果(浮点数(并想使用 ui。QProgressBar.setValue(result( 在 detect.run 中,但有时会导致错误。

错误是

QPainter::begin: A paint device can only be painted by one painter at a time.
QPainter::setCompositionMode: Painter not active

搜索了这个问题,发现我不能在 GUI 线程之外使用 setValue。一些答案说应该使用信号和插槽来做到这一点。任何人都告诉我如何编写代码

你不能从另一个线程更新GUI,所以有几个选项,如信号,QEvent,QMetaObject::invokeMethod((或QTimer::singleShot(0,...(与functools.partial。我将使用最后 2 种方法:

  1. QMetaObject::invokeMethod((
QtCore.QMetaObject.invokeMethod(
    ui.QProgressBar, "setValue", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(result)
)
  1. QTimer::singleShot(0, ...( with functools.partial
from functools import partial
# ...
wrapper = partial(ui.QProgressBar.setValue, result)
QtCore.QTimer.singleShot(0, wrapper)

相关内容

  • 没有找到相关文章

最新更新