2010-06-03 10 views
43

Tengo problemas con una señal personalizada en una clase que hice.El objeto PyQt4.QtCore.pyqtSignal no tiene el atributo 'connect'

código relevante:

self.parse_triggered = QtCore.pyqtSignal() 

def parseFile(self): 
    self.emit(self.parse_triggered) 

Tanto de los que pertenecen a la clase: RefreshWidget. En su clase padre tengo:

self.refreshWidget.parse_triggered.connect(self.tabWidget.giveTabsData()) 

Cuando trato de ejecutar el programa, me sale el error:

AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect' 

Ayuda? Gracias de antemano.

+1

'self.tabWidget.giveTabsData()' parece sospechoso, ya que tendría que devolver una función/controlador, pero eso no debería estar relacionado con el error real que está recibiendo. De lo contrario, se ve bien. –

+1

Estoy teniendo exactamente el mismo problema. Si encuentra una resolución, ¿podría publicar y editar cuál fue el problema? –

Respuesta

74

Tuve el mismo problema exacto que tú.

trate de mover

self.parse_triggered = QtCore.pyqtSignal() 

de su constructor, pero dentro de su declaración de la clase. Así que en lugar de ello con este aspecto:

class Worker(QtCore.QThread): 
    def __init__(self, parent = None): 
     super(Worker, self).__init__(parent) 

     self.parse_triggered = QtCore.pyqtSignal() 

Debe tener un aspecto como este:

class Worker(QtCore.QThread): 
    parse_triggered = QtCore.pyqtSignal() 

    def __init__(self, parent = None): 
     super(Worker, self).__init__(parent) 

Esto podría no ser en absoluto lo que busca, pero funcionó para mí. Volví a cambiar a las señales de estilo antiguo de todos modos porque no he encontrado una manera en las señales de estilo nuevo para tener un número indefinido o tipo de parámetros.

+0

Funciona para mí. ¡Buena atrapada! –

+0

¡Eso lo hizo! Gracias. –

+38

¿Alguien puede explicar por qué es esto? –

-2

¿Por qué se conecta directamente a la señal, mientras que usted puede hacer self.connect(widget, SIGNAL('parse_triggered()'), listener.listening_method)?

donde uno mismo es, por ejemplo, la forma en sí, y puede ser el mismo que el oyente

+0

Supuestamente esa es la "vieja forma" de hacer connect(). Por lo que he leído, ese método no presentará ningún error, incluso si existen. –

+2

Esto es señales y ranuras antiguas. Ambos funcionan, pero las personas tienden a pensar que el nuevo estilo es más elegante/pitónico. –

9

recientemente he empezado a trabajar con PySide (propia versión de Nokia de PyQt), y vio el mismo comportamiento exacto (y solución de) con señales personalizadas de estilo nuevo. Mi mayor preocupación con la solución era que usar una variable de clase para mantener la señal arruinaría las cosas cuando tengo varias instancias de esa clase (QThreads en mi caso).

Por lo que pude ver, QtCore.QObject.__init__(self) encuentra la variable Signal en la clase y crea una copia de esa señal para la instancia. No tengo idea de qué es QObject.__init__(), pero la señal resultante funciona correctamente con connect(), disconnect() y emit() (y también un método __getitem__()), mientras que las variables de señal de clase o independiente creadas fuera de una clase derivada de QObject no tienen estos métodos y no puede ser usado apropiadamente

53

También recibe ese mensaje de error si no puede llamar a super() o QObject.__init__() en su clase personalizada.

una lista de verificación para la definición de las señales personalizados en una clase en Qt en Python:

  • su clase se deriva de QObject (directa o indirectamente)
  • sus clases __init__ llamadas super() (o llama QObject.__init__() directamente.)
  • su señal se define como una variable de clase, no una variable de instancia
  • la firma (argumentos formales) de su señal coincide con la firma de cualquier ranura que conectará a la señal, p. () o (int) o (str) o ((int,), (str,))
+0

esto me salvó el día, señor señor! : D – kissgyorgy

+0

El error que obtuve aquí fue en la línea de "las señales deben estar vinculadas a instancias de QObject, no a ". Como me había derivado de QObject, me pareció desconcertante. Pero no había llamado al QObject '__init__' de ninguna manera. ¡Gracias por el consejo! –

+1

Como estaba usando un QRunnable, también tuve este problema ya que no hereda QObject. La solución fue hacer de mi clase una subclase de QObject y también de QRunnable, y llamar a ambos 'QObject .__ init __ (self)' y 'QRunnable .__ init __ (self)' en mi clase '' __init__' method. – aktungmak

2

Para utilizar el sistema de señal/ranura es necesario tener un QObject heredó clase.

Aquí está un ejemplo sencillo:



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

2

que tenían el mismo problema. Olvidé que si una clase usa señales, entonces debe heredar de QObject. Estaba haciendo un re-factoring y no le presté atención a esto.

Cuestiones relacionadas