web-dev-qa-db-fra.com

L'objet PyQt4.QtCore.pyqtSignal n'a pas d'attribut 'connect'

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.

52
Dane Larsen

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.

98
Joel Verhagen

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:

  • votre classe dérive de QObject (directement ou indirectement)
  • votre classe __init__ appelle super() (ou appelle QObject.__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 quel emplacement que vous connecterez au signal, par ex. () Ou (int) Ou (str) Ou ((int,), (str,))
65
bootchk

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.

10
Jare

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()

 
4
Lokinou

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.

3
FrancoLM