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.

46
demandé sur Dane Larsen 2010-06-04 02:42:09

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.

81
répondu Joel Verhagen 2014-01-31 14:31:03

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__ appelle super() (ou des appels 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 quelle fente que vous connecterez au signal par exemple () ou (int) ou (str) ou ((int,), (str,))
57
répondu bootchk 2014-03-28 14:03:10

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.

10
répondu Jare 2010-09-12 19:28:15

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

 
3
répondu Lokinou 2013-07-18 10:58:03

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.

3
répondu FrancoLM 2014-04-19 17:01:20

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

-1
répondu Guard 2010-06-04 14:05:45