2016-06-02 1 views
2

Je tente d'utiliser un QtCore.Signal pour envoyer une nouvelle instance d'une classe au parent de l'objet. Ce que je tente de faire est la suivante, mais échoue avec:Un signal QtCore peut-il être défini sur la classe en cours?

NameError: name 'myClass' is not defined

class myClass(QtGui.QMainWindow): 
    mySignal = QtCore.Signal(myClass) 
    def __init__(self, parent=None): 
     super(myClass, self).__init__(parent) 

    def create_new_self(self): 
     newSelf = myClass(self.parent()) 
     self.mySignal.emit(newSelf) 

class myParentClass(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(myParentClass, self).__init__(parent) 
     myNewClass = myClass(self) 
     myNewClass.mySignal.connect(self.handle_my_signal) 

    @QtCore.Slot(myClass) 
    def handle_my_signal(self, newMyClass): 
     newMyClass.mySignal.connect(self.handle_my_signal) 
     self.listOfClasses.append(newMyClass) 

en changeant la ligne:

mySignal = QtCore.Signal(myClass) 

à

mySignal = QtCore.Signal(QtGui.QMainWindow) 

semble corriger l'erreur, mais je ne suis pas sûr que ce soit la bonne façon de faire quelque chose comme ça, sinon que ce n'est probablement pas la meilleure façon de faire ce que je fais.

Répondre

2

La façon typique de le faire serait de définir le signal comme

mySignal = QtCore.Signal(object) 

puisque vous souhaitez émettre une instance d'une classe.

EDIT: Si vous souhaitez contourner la dépendance circulaire, vous pouvez placer votre signal dans une classe wrapper. Par exemple.

class myClass(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(myClass, self).__init__(parent) 
     # Note: argument of "self" is to parent the object 
     self.signalwrapper = MyWrapper(self) 

    def create_new_self(self): 
     newSelf = myClass(self.parent()) 
     self.signalwrapper.mySignal.emit(newSelf) 

class MyWrapper(QtCore.QObject): 
    mySignal = QtCore.Signal(myClass) 
+0

Y at-il un avantage à utiliser un typage plus précis? Donc par exemple, si je passe et 'int' à travers un signal, je pourrais aussi simplement utiliser' object' puisque (presque?) Tout est "de première classe"? –

+1

@busfault Si vous définissez également vos emplacements en utilisant 'pyqtSlot', être plus spécifique dans vos types peut vous permettre d'attraper des erreurs. Cela peut également être utile si vous envoyez des signaux à travers des threads, et la documentation indique que la mémoire peut être plus efficace. –

+0

@BrendanAbel J'utilise 'PySide' qui n'a pas' pyqtSlot', seulement 'QtCore.Slot()' 'pyqtSlot' offre-t-il la capacité d'attraper des erreurs de type? Un problème que j'ai rencontré une fois est que j'ai changé une définition 'Signal' et non pas la' Slot' correspondante et que soudainement 'Slot' n'obtenait plus le' Signal'. –