Потоки и сигналы
Имеется следующий код:
import time
import sys
#from PyQt6.QtWidgets import (
from PyQt5.QtWidgets import (
QApplication,
QPushButton,
QTextEdit,
QVBoxLayout,
QWidget
)
from threading import Thread
class Window(QWidget):
def __init__(self):
super().__init__()
mainLayout = QVBoxLayout()
self.output = QTextEdit()
self.output.setReadOnly(True)
mainLayout.addWidget(self.output)
self.startButton = QPushButton("Start")
self.startButton.clicked.connect(self.start)
mainLayout.addWidget(self.startButton)
self.setLayout(mainLayout)
def task(self):
while True:
obj = Actions()
obj.do()
time.sleep(3)
def start(self):
t1 = Thread(target=self.task)
t1.start()
class Actions():
def do(self):
window.output.append("...")
if __name__ == "__main__":
app = QApplication([])
window = Window()
window.show()
sys.exit(app.exec())
При выполнении данного примера (для PyQt5) получаю предупреждение cледующего плана:
QObject::connect: Cannot queue arguments of type 'QTextCursor' (Make sure 'QTextCursor' is registered using qRegisterMetaType().)
- нельзя взаимодействовать с виджетами в других потоках, поэтому этот варнинг и выводится
- когда потоку надо что-то поменять в окне, он отправляет сигнал главному потоку, а обработчик в главном потоке выполняет необходимые изменения
Как реализовать второй пункт? Есть ли хорошие туториалы с примерами по этой теме?
Заранее спасибо!
Источник: Stack Overflow на русском