2011-09-28 2 views
1
from PySide.QtCore import * 

class Eggs(QObject): 
    evt_spam = Signal() 
    print "Loaded" 

a = Eggs() 
b = Eggs() 
print a.evt_spam 
print b.evt_spam 
print a.evt_spam is b.evt_spam 

sorties:PySide signal "duplication" comportement

Loaded 
<PySide.QtCore.Signal object at 0xa2ff1a0> 
<PySide.QtCore.Signal object at 0xa2ff1b0> 
False 

"Loaded" Impression une seule fois (comme prévu, il est une variable de classe), mais pourquoi sont 2 cas du signal en cours de création (si c'est aussi une variable de classe)?

+0

est pas la question universitaire? Il est seulement important que cela fonctionne: toutes les instances peuvent émettre le signal et tous les abonnés (toutes les instances connectées au signal) reçoivent le signal. Je suis d'accord que c'est intéressant. Mais ce n'est pas une lacune, ou de limiter à la plupart des programmes. – bootchk

Répondre

3

Il n'est pas imprimé lorsque vous créez une instance de classe, mais plutôt lorsque la portée de la classe est exécutée. Ce code affichera "Loaded", même si je n'ai jamais créé d'instance de "Test".

class Test: 
    print "Loaded" 

Si vous voulez exécuter du code lorsque la classe est initialisé, jetez un oeil à __init__(). Ce code affichera "Loaded" lorsqu'une instance est créée, au lieu de quand la classe elle-même est définie.

class Test: 
    def __init__(self): 
     print "Loaded" 

QObject QT de métaclasse semble être réécrire les attributs de classe pour éviter les signaux en double lors de l'initialisation d'une nouvelle instance de la classe. Peut-être que vous pouvez attribuer l'attribut comme ceci:

class Test(QObject): 
    def __init__(self, signal): 
     self.evt_spam = signal 

sig = Signal() 
a = Test(sig) 
b = Test(sig) 

Ou ceci:

class Test(QObject): 
    def signal(self, signal): 
     self.evt_spam = evt_spam 
     return self 

evt_spam = Signal() 
a = Test().signal(evt_spam) 
b = Test().signal(evt_spam) 
+0

Oui, je comprends cela, mais pourquoi deux instances du signal sont-elles créées? Je vais éditer ma question pour la rendre plus claire. –

+0

'QObject' est une métaclasse. Ma meilleure idée est de tromper les attributs de la classe. Les résultats sont différents si vous n'héritez pas de 'QObject', correct? – lunixbochs

+0

Si je change 'QObject' en' object', le signal ne fonctionnera pas, mais les variables pointent vers le même emplacement mémoire. Donc c'est probablement juste. Que pensez-vous sont les chances de ce changement (dans une future version de Qt)? –

Questions connexes