pyqt
Używanie wątków z PyQt
Szukaj…
Uwagi
Chociaż niektóre części ramy Qt są bezpieczne dla wątków, większość z nich nie jest. Dokumentacja Qt C ++ zapewnia dobry przegląd klas, które są ponownie wystawiane (mogą być używane do tworzenia instancji obiektów w wielu wątkach). Najczęściej poszukiwane są następujące zasady:
- Nie można utworzyć ani uzyskać dostępu do obiektu GUI Qt spoza głównego wątku (np.
QWidget
coQWidget
lub podobne). - Nawet jeśli klasa Qt jest ponownie wydana, nie można współużytkować dostępu do obiektu Qt między wątkami, chyba że dokumentacja Qt dla tej klasy wyraźnie stwierdza, że instancje są bezpieczne dla wątków.
- Możesz użyć
QObject.moveToThread()
jeśli chcesz przenieść obiekt Qt z jednego wątku do drugiego (nie dotyczy obiektów GUI Qt, które zawsze muszą pozostać w głównym wątku). Pamiętaj jednak, że obiekt nie może mieć rodzica.
Zgodnie z tym przepełnienie stosu QA, nie zaleca się stosowania Python wątki jeśli wątek zamierza współdziałać z PyQt w jakikolwiek sposób (nawet jeśli ta część ram Qt jest bezpieczne dla wątków).
Model roboczy
# 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow