J'ai des problèmes avec un signal personnalisé dans une classe que j'ai faite.
Code pertinent:
self.parse_triggered = QtCore.pyqtSignal()
def parseFile(self):
self.emit(self.parse_triggered)
Les deux appartiennent à la classe: RefreshWidget. Dans sa classe parente, 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'
Aidez-moi? Merci d'avance.
J'ai eu exactement le même problème que vous.
Essayez de bouger
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()
Ça devrait ressembler à ça:
class Worker(QtCore.QThread):
parse_triggered = QtCore.pyqtSignal()
def __init__(self, parent = None):
super(Worker, self).__init__(parent)
Ce n'est peut-être pas du tout ce que vous recherchez, mais cela a fonctionné pour moi. Je suis quand même revenu aux signaux à l'ancienne parce que je n'ai pas trouvé de moyen dans les signaux à nouveau style d'avoir un nombre ou un type de paramètres indéfinis.
Vous obtenez également ce message d'erreur si vous ne parvenez pas à appeler super()
ou QObject.__init__()
dans votre classe personnalisée.
Une liste de contrôle pour définir des signaux personnalisés dans une classe dans Qt en Python:
__init__
appelle super()
(ou appelle QObject.__init__()
directement.)()
Ou (int)
Ou (str)
Ou ((int,), (str,))
J'ai récemment commencé à travailler avec PySide (la propre version de Nokia de PyQt) et j'ai vu exactement le même comportement (et la même solution) avec des signaux de nouveau style personnalisés. Ma plus grande préoccupation avec la solution était que l'utilisation d'une variable de classe pour contenir le signal gâcherait les choses lorsque j'ai plusieurs instances de cette classe (QThreads dans mon cas).
D'après 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 de ce que fait QObject.__init__()
, mais le signal résultant fait les méthodes connect()
, disconnect()
et emit()
(et aussi un __getitem__()
), alors que la classe Signal ou les variables Signal autonomes 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 de signal/slot, vous devez avoir une classe héritée 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 __== '__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 une refactorisation et je n'y ai pas prêté attention.