Название: Простой пример работы с QThread
Отправлено: paul_winex от Сентябрь 11, 2013, 13:28
Есть простой пример использования QThread. Простой окно с кнопкой запуска процесса. Каждая итерация процесса изменяет текст на кнопке. При этом само окно не виснет и доступно. Python from PyQt4.QtCore import * from PyQt4.QtGui import * import time class Worker(QObject): finished = pyqtSignal() message = pyqtSignal(int) @pyqtSlot() def process(self): print 'START' for i in range(10): print 'sleep', i self.message.emit(i) time.sleep(0.5) print 'FINISHED' self.finished.emit() class MyWidget(QWidget): def __init__(self, *args, **kwargs): super(MyWidget, self).__init__(*args, **kwargs) self.button = QPushButton("Start process", self) self.button.clicked.connect(self.start) layout = QVBoxLayout(self) layout.addWidget(self.button) self.resize(250, 150) def start(self): thread = QThread(self) worker = Worker() worker.moveToThread(thread) # thread.started.connect(worker.process) self.connect(thread, SIGNAL('started()'), worker, SLOT('process()')) worker.finished.connect(thread.quit) worker.message.connect(self.text) thread.start() def text(self, i): self.button.setText('Process '+str(i)) app = QApplication([]) widget = MyWidget() widget.show() app.exec_()
Никаких ошибок нет, но не срабатывает запуск процесса worker.process, на который законекчен сигнал started() самого потока. То есть вся работа должна начаться, когда Thread запущен, но ничего не происходит. Возможно я где-то что-то не до конектил? Спасибо.
Название: Re: Простой пример работы с QThread
Отправлено: paul_winex от Сентябрь 11, 2013, 15:08
Что ж, истина была рядом. нужно было объекты thread и worker делать объектами класса через self Python from PyQt4.QtCore import * from PyQt4.QtGui import * import time class Worker(QObject): finished = pyqtSignal() message = pyqtSignal(int) @pyqtSlot() def process(self): print 'START' for i in range(10): print 'sleep', i self.message.emit(i) time.sleep(0.5) print 'FINISHED' self.finished.emit() class MyWidget(QWidget): def __init__(self, *args, **kwargs): super(MyWidget, self).__init__(*args, **kwargs) self.start_btn = QPushButton("Start process", self) self.start_btn.clicked.connect(self.start) layout = QVBoxLayout(self) layout.addWidget(self.start_btn) self.resize(250, 150) def start(self): self.thread = QThread(self) self.worker = Worker() self.worker.moveToThread(self.thread) self.thread.started.connect(self.worker.process) self.worker.finished.connect(self.thread.quit) self.worker.finished.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) self.worker.message.connect(self.text) self.thread.start() def text(self, i): self.start_btn.setText('Process '+str(i)) app = QApplication([]) widget = MyWidget() widget.show() app.exec_()
Остается вопрос как корректно завершить процесс в любой момент до его окончания, но это наверное другая тема.
|