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

时间:2019-04-25 10:42:33

标签: python multithreading pyqt pyqt5 qprogressbar

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

错误是

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

我搜索了这个问题,发现我无法在GUI线程外使用setValue。一些答案说,应该使用信号和插槽来执行此操作。 有人告诉我如何编写代码

1 个答案:

答案 0 :(得分:0)

您无法从另一个线程更新GUI,因此有一些选项,例如信号,QEvent,QMetaObject :: invokeMethod()或QTimer :: singleShot(0,...)和functools.partial。我将使用最后两种方法:

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

# ...

wrapper = partial(ui.QProgressBar.setValue, result)
QtCore.QTimer.singleShot(0, wrapper)