pyqt
Использование потоков с PyQt
Поиск…
замечания
Хотя некоторые части структуры Qt являются потокобезопасными, большая часть из них не является. Документация Qt C ++ дает хороший обзор того, какие классы являются реентерабельными (их можно использовать для создания объектов в нескольких потоках). Наиболее распространенными являются следующие правила:
- Вы не можете создать или получить доступ к объекту Qt GUI извне основного потока (например, все, что подклассы
QWidget
или аналогичные). - Даже если класс Qt является реентерабельным, вы не можете предоставить доступ к объекту Qt между потоками, если только в документации Qt для этого класса явно не указано, что экземпляры являются потокобезопасными.
- Вы можете использовать
QObject.moveToThread()
если вам нужно переместить объект Qt из одного потока в другой (не относится к объектам GUI Qt, которые всегда должны оставаться в основном потоке). Но обратите внимание, что объект не должен иметь родителя.
В соответствии с этим контролем качества стека не рекомендуется использовать потоки Python, если ваш поток намеревается каким-либо образом взаимодействовать с PyQt (даже если эта часть оболочки Qt является потокобезопасной).
Модель рабочего
# this method can be anything and anywhere as long as it is accessible for connection
@pyqtSlot()
def run_on_complete():
pass
# An object containing methods you want to run in a thread
class Worker(QObject):
complete = pyqtSignal()
@pyqtSlot()
def a_method_to_run_in_the_thread(self):
# your code
# Emit the complete signal
self.complete.emit()
# instantiate a QThread
thread = QThread()
# Instantiate the worker object
worker = Worker()
# Relocate the Worker object to the thread
worker.moveToThread(thread)
# Connect the 'started' signal of the QThread to the method you wish to run
thread.started.connect(worker.a_method_to_run_in_the_thread)
# connect to the 'complete' signal which the code in the Worker object emits at the end of the method you are running
worker.complete.connect(run_on_complete)
# start the thread (Which will emit the 'started' signal you have previously connected to)
thread.start()
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow