Как использовать QProgressBar.setValue вне потока GUI. Ошибка перекраски - PullRequest
0 голосов
/ 25 апреля 2019

Я использую PyQt, чтобы показать результат обнаружения.У меня есть два потока, один Ui_MainWindow UI и один QThread обнаружения.Я получил результат обнаружения (число с плавающей запятой) и хочу использовать ui.QProgressBar.setValue (результат) в detect.run, но иногда это может привести к ошибке.

Ошибка:

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

Я искал этот вопрос и обнаружил, что не могу использовать setValue вне потока GUI.И некоторые ответы говорят, что для этого нужно использовать сигнал и слот.Кто-нибудь подскажет, как написать код

1 Ответ

0 голосов
/ 25 апреля 2019

Вы не можете обновить 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, ...) с functools.partial :
from functools import partial

# ...

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