PyQt5: Как переместить объект QObject в основной поток? - PullRequest
0 голосов
/ 01 июня 2018

Я знаю, что в общем случае QObject() экземпляры должны создаваться в главном потоке.Я также знаю, что после создания вы можете переместить QObject() из основного потока в другой:

можно найти официальные документы Qt здесь

    # Worker-object approach
    # -----------------------
    # Note: these codelines execute in the main thread.
    workerThread = QThread()
    workerObj = WorkerObj()
    workerObj.moveToThread(workerThread)


В настоящее время я сталкиваюсь с совершенно противоположной проблемой.У меня есть QObject(), созданный в (неосновной) QThread.Я хочу переместить его в основной поток, например:

    # Move a QObject() to the main thread
    # ------------------------------------
    # Note: these codelines execute in some QThread
    myObj = QObject()
    myObj.moveToThread(threading.main_thread())

Я получаю следующую ошибку:

TypeError: moveToThread (self, QThread): аргумент 1 имеет неожиданный аргументвведите '_MainThread'

Возможно, я получаю сообщение об ошибке, поскольку основной поток не является подлинным QThread.Что я должен сделать, чтобы это работало?


РЕДАКТИРОВАТЬ:
Видимо, был правильный ответ в документации функции moveToThread().Это довольно неловко.Мои искренние извинения.В следующий раз я буду более осторожен.


1 Ответ

0 голосов
/ 01 июня 2018

QObject экземпляры могут быть созданы в любом потоке, конечно.И они есть, и Qt был бы совершенно бесполезен без этого.То, что вы ищете, это глобальный объект приложения и его поток:

myObj = QObject()
mainThread = QCoreApplication.instance().thread()
myObj.moveToThread(mainThread)

Это неопределенное поведение - вызывать из текущего потока любые не поточно-безопасные методы объекта после moveToThread звонок.После этого вызова не-потокобезопасные методы объекта можно безопасно использовать только из целевого потока.

...