2013-11-22 4 views
1

У меня есть QWidget, который вызывает некоторый код python с помощью QThread. Этот код также выполняет некоторую логику и вызывает другой класс. В этом классе я хочу передать сигнал до моего QWidget, чтобы напечатать «Hello World». Код в его нынешнем виде дает ошибку sm instance has no attribute 'sayHello', которую я знаю - я просто не знаю, как сделать метод run вызовом другого класса, чтобы все сигналы работали.PyQt4: наследование QThread

widget.py

from prog import TaskThread 
from PyQt4 import QtCore, QtGui 
class MyWidget(QtGui.QWidget): 
    def __init__(self): 
    self.btn = QtGui.QPushButton('Run!', self) 
    self.btn.clicked.connect(self.onStart) 
    self.myLongTask = TaskThread() 
    self.myLongTask.sayHello.connect(self.sayHi) 

    def onStart(self): 
    self.myLongTask.start() 

    def sayHi(self): 
    print "hello world" 

prog.py

from PyQt4 import QtCore 
from sm import sc 
class TaskThread(QtCore.QThread): 
    sayHello = QtCore.pyqtSignal() 
    def run(self): 
    sm.sc() 

sm.py

class sc(): 
    def __init__(self): 
    for i in range(0,50): 
     print i 
     if i == 5: self.sayHello.emit() 

ответ

3

мне пришлось немного изменить свой код ге чтобы он работал на моей машине, но вручную передавая экземпляр сигнала в класс sc, безусловно, повышает сигнал. Выход может чередоваться с печатью i-го цикла.

widget.py

from prog import TaskThread 
import sys 
from PyQt4 import QtCore, QtGui 

class flexemWidget(QtGui.QWidget): 
    def __init__(self): 
    super(flexemWidget, self).__init__() 
    self.btn = QtGui.QPushButton('Run!', self) 
    self.btn.clicked.connect(self.onStart) 
    self.myLongTask = TaskThread() 
    self.myLongTask.sayHello.connect(self.sayHi) 
    self.show() 

    def onStart(self): 
    self.myLongTask.start() 

    def sayHi(self): 
    print "hello world" 

app = QtGui.QApplication(sys.argv) 
ex = flexemWidget() 
sys.exit(app.exec_()) 

prog.py

from PyQt4 import QtCore 
from sm import sc 
class TaskThread(QtCore.QThread): 
    sayHello = QtCore.pyqtSignal() 
    def run(self): 
    sc(self.sayHello) 

sc.py

from PyQt4 import QtCore 
class sc(): 
    def __init__(self, signal): 
    for i in range(0,50): 
     print i 
     if i == 5: signal.emit() 
+0

Это работает благодаря; Я думаю, что простота ответа показывает мое отсутствие понимания OO Python! Однако, это лучший способ сделать это, или есть альтернативные способы, которые я, вероятно, не понял? – ChrisW

Смежные вопросы