Форум сайта python.su
Как правильно это делать?
Если напрямую подкл. сигнал к слоту, то вызов происходит как будто в главном потоке…
Можно ли вызывать в Qthread.run и не костыль ли это: каждый раз Qthread.start дергать. ?
Просто сейчас примерный код такой код:
class MainForm(QWidget): signal = pyqtSignal(str) def __init__(self): QWidget.__init__(self) self.button = QPushButton(u'Запустить поток') self.button.clicked.connect(lambda: self.signal.emit('Нужная строка....')) class WorckThread(QThread): arg_ = '' def method(self): #Тут долгая блокирующая операция.... def run(self): if not self.isRunning(): self.exec_() self.method('Нужная строка....') class Main(QApplication): def __init__(self): ....... ....... ....... self.main_form = MainForm() self.worckthread = WorckThread() def start_block_thread(self): self.worckthread.arg_ = 'Нужная строка....' self.worckthread.run() if __name__ == '__main__': Main()
class Main(QApplication): def __init__(self): ....... ....... ....... self.main_form = MainForm() self.worckthread = WorckThread() self.main_form.button.connect( self.worckthread.method)
Отредактировано mironich (Дек. 24, 2012 01:27:44)
Офлайн
mironichНичего плохого, просто каждый раз создается новый поток.
Можно ли вызывать в Qthread.run и не костыль ли это: каждый раз Qthread.start дергать. ?
self.button.clicked.connect(self.worckthread.start)
mironichQt здесь не узнает к какому потоку относится method и в какую очередь сообщений это отправлять, поэтому соединяет сигнал напрямую.
А хотелось бы:
self.main_form.button.connect( self.worckthread.method)
from PyQt4 import QtGui, QtCore import time class Worker(QtCore.QObject): def method1(self): print 'sleep in method1' time.sleep(5) print text def method2(self): print 'sleep in method2' time.sleep(5) print text class MyWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super(MyWidget, self).__init__(*args, **kwargs) self.worker_thread = QtCore.QThread(self) self.worker = Worker() self.worker.moveToThread(self.worker_thread) self.worker_thread.start() button1 = QtGui.QPushButton("Start1", self) button2 = QtGui.QPushButton("Start2", self) button1.clicked.connect(self.worker.method1) button2.clicked.connect(self.worker.method2) layout = QtGui.QVBoxLayout(self) layout.addWidget(button1) layout.addWidget(button2) app = QtGui.QApplication([]) widget = MyWidget() widget.show() app.exec_()
Офлайн