PyQt4.QtCore.l'objet pyqtSignal n'a pas d'attribut "connect"
j'ai des problèmes avec un signal personnalisé dans un cours que j'ai fait.
code pertinent:
self.parse_triggered = QtCore.pyqtSignal()
def parseFile(self):
self.emit(self.parse_triggered)
tous les deux appartiennent à la classe: Refrewidget. Dans sa classe parente que j'ai:
self.refreshWidget.parse_triggered.connect(self.tabWidget.giveTabsData())
Lorsque j'essaie d'exécuter le programme, j'obtiens l'erreur:
AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'
de l'Aide? Merci à l'avance.
6 réponses
j'ai eu exactement le même problème que vous.
Essayez de déplacer
self.parse_triggered = QtCore.pyqtSignal()
hors de votre constructeur mais dans votre déclaration de classe. Donc, au lieu de ressembler à ceci:
class Worker(QtCore.QThread):
def __init__(self, parent = None):
super(Worker, self).__init__(parent)
self.parse_triggered = QtCore.pyqtSignal()
Il devrait ressembler à ceci:
class Worker(QtCore.QThread):
parse_triggered = QtCore.pyqtSignal()
def __init__(self, parent = None):
super(Worker, self).__init__(parent)
Cela pourrait ne pas être ce que vous cherchez, mais il a travaillé pour moi. De toute façon, je suis revenu aux signaux de l'ancien style parce que je n'ai pas trouvé le moyen dans les signaux du nouveau style d'avoir un nombre ou un type de paramètre.
vous obtenez aussi ce message d'erreur si vous ne réussissez pas à appeler super()
ou QObject.__init__()
dans votre classe personnalisée.
Une liste de contrôle pour définir les signaux personnalisés dans une classe de Qt en Python:
- votre classe dérive de QObject (directement ou indirectement)
- votre classe
__init__
appellesuper()
(ou des appelsQObject.__init__()
directement.) - votre signal est défini comme une variable de classe, pas une variable d'instance
- la signature (arguments formels) de votre signal correspond à la signature de n'importe quelle fente que vous connecterez au signal par exemple
()
ou(int)
ou(str)
ou((int,), (str,))
J'ai récemment commencé à travailler avec PySide (la propre version de PyQt de Nokia), et j'ai vu exactement le même comportement (et la même solution) avec des signaux personnalisés de nouveau style. Ma plus grande préoccupation avec la solution était que l'utilisation d'une variable de classe pour maintenir le signal gâcherait les choses lorsque j'ai plusieurs instances de cette classe (QThreads dans mon cas).
De ce que j'ai pu voir, QtCore.QObject.__init__(self)
trouve la variable Signal dans la classe et crée une copie de ce Signal pour l'instance. Je n'ai aucune idée QObject.__init__()
fait, mais le Signal résultant fait correctement connect()
, disconnect()
et emit()
méthodes (et aussi un __getitem__()
méthode), alors que les variables Signal de classe ou Signal autonome créées en dehors d'une classe dérivée de QObject n'ont pas ces méthodes et ne peuvent pas être utilisées correctement.
pour utiliser le système signal / slot vous avez besoin d'avoir une classe héritée de QObject.
Voici un exemple simple:
from PySide import QtCore
class LivingBeing(QtCore.QObject):
bornSignal = QtCore.Signal() # initialise our signal
def __init__(self,name):
QtCore.QObject.__init__(self) # initialisation required for object inheritance
self.bornSignal.connect(self.helloWorld) # connect the born signal to the helloworld function
self.name = name #
self.alive = False
def summonFromClay(self):
self.alive = True
self.bornSignal.emit() # emit the signal
def helloWorld(self):
print "Hello World !, my name is %s, this place is so great !" % self.name
# now try the little piece of code
if __name__ == '__main__':
firstHuman = LivingBeing('Adam')
firstHuman.summonFromClay()
j'ai eu le même problème. J'ai oublié que si une classe utilise des signaux, elle doit hériter de QObject. Je faisais un remaniement et je n'ai pas fait attention à ça.
pourquoi vous connecter directement au signal, alors que vous pouvez faire
self.connect(widget, SIGNAL('parse_triggered()'), listener.listening_method)
?
où self est, par exemple, la forme elle-même, et peut être le même que l'auditeur