我使用 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 种方法:
- QMetaObject::invokeMethod((
QtCore.QMetaObject.invokeMethod(
ui.QProgressBar, "setValue", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(result)
)
- QTimer::singleShot(0, ...( with functools.partial:
from functools import partial
# ...
wrapper = partial(ui.QProgressBar.setValue, result)
QtCore.QTimer.singleShot(0, wrapper)