我使用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。一些答案说,应该使用信号和插槽来执行此操作。 有人告诉我如何编写代码
答案 0 :(得分:0)
您无法从另一个线程更新GUI,因此有一些选项,例如信号,QEvent,QMetaObject :: invokeMethod()或QTimer :: singleShot(0,...)和functools.partial。我将使用最后两种方法:
QtCore.QMetaObject.invokeMethod(
ui.QProgressBar, "setValue", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(result)
)
from functools import partial
# ...
wrapper = partial(ui.QProgressBar.setValue, result)
QtCore.QTimer.singleShot(0, wrapper)