2015-07-14 4 views
0

J'ai une classe MainWindow qui a une application Gui fonctionnant dessus et je veux que chaque fois que je clique sur un bouton de mon application, un signal est émis et attrapé par un autre thread. Il est mon exemple de code (désolé pour ne pas poster mon code réel, mais il est vraiment grand maintenant):Comment attraper un signal de la classe QMainWindow par un autre thread sur PySide?

from PySide.QtGui import * 
from PySide.QtCore import * 
import sys 
import mainGui #Gui file 

class MainWindow(QMainWindow, mainGui.Ui_MainWindow): 

mySignal = Signal() 


    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.setupUi(self) 
     self.newThread = workThread() 
     self.newThread.start() 

     #myButton is part of Gui application 
     self.myButton.clicked.connect(self.myfunction) 

    def myfunction(self): 
     self.mySignal.emit() 

    (...) #Other functions and methods 

class workThread(QThread): 
    def __init__(self, parent=None): 
     super(workThread, self).__init__(parent) 

     #The problem: 
     MainWindow.mySignal.connect(self.printMessage) 

    def run(self): 
      (...) 

    def printMessage(self): 
     print("Signal Recived") 
     (...) 


def main(): 
    app = QApplication(sys.argv) 
    form = MainWindow() 
    form.show() 
    app.exec_() 

if __name__=="__main__": 
    main() 

... et je reçois l'erreur suivante: MainWindow.mySignal.connect (self.printMessage) AttributeError: l'objet 'PySide.QtCore.Signal' n'a pas d'attribut 'connect'

Il y a des ideia comment puis-je résoudre ceci? Merci d'avance!

Répondre

0

Les signaux sont comme des méthodes - ils doivent être liés à des instances. Ils ne fonctionneront pas correctement si vous essayez d'y accéder directement via la classe.

Une façon de fixer l'exemple est de passer l'instance de MainWindow en tant que parent du fil, comme ceci:

self.newThread = workThread(self) 
    ... 

    parent.mySignal.connect(self.printMessage)