2013-07-10 7 views
7

Ho cercato di trovare un modo per aggiornare il thread della GUI da un thread Python al di fuori del main. Il PyQt5 docs su sourceforge ha buone istruzioni su come farlo. Ma non riesco ancora a far funzionare le cose.PyQt5 Signals and Slots 'QObject has no attribute' error

C'è un buon modo per spiegare il seguente output da una sessione interattiva? Non dovrebbe esserci un modo per chiamare il metodo emit su questi oggetti?

>>> from PyQt5.QtCore import QObject, pyqtSignal 
>>> obj = QObject() 
>>> sig = pyqtSignal() 
>>> obj.emit(sig) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'QObject' object has no attribute 'emit' 

e

>>> obj.sig.emit() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'QObject' object has no attribute 'sig' 

e

>>> obj.sig = pyqtSignal() 
>>> obj.sig.emit() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'emit' 
+1

stesso di qui: [PyQt5 in quale modulo è il metodo Emit trovato?] (Http://stackoverflow.com/questions/17581506/pyqt5-in-what-module-is-the-emit-method -fondo) - solo i segnali __bound__ hanno un metodo 'emit'. ('obj.sig = pyqtSignal()' è ancora un segnale non associato) – mata

+0

@mata: Sì, stavo prendendo questi esempi dai documenti PyQt5 su sourceforge. Come hai [sottolineato] (http://stackoverflow.com/questions/17581506/pyfqt5-in-what-module-is-the-emit-method-found), il metodo emit è per un segnale associato, cioè è un membro di una classe che eredita da QObject. Non mi ero reso conto che non lo stavo facendo nella sessione interattiva incollata sopra. – ADB

+0

@ mata: Solo curioso, quale sarebbe l'utilità di ** obj.sig = pyqtSignal() **, come nel terzo esempio sopra? – ADB

risposta

15

seguenti parole e codici sono in PyQt5 docs.

nuovi segnali devono essere definiti soltanto in sottoclassi di QObject.They deve essere parte della definizione della classe e non può essere aggiunto dinamicamente gli attributi classe dopo la classe è stata definita.

from PyQt5.QtCore import QObject, pyqtSignal 

class Foo(QObject): 

    # Define a new signal called 'trigger' that has no arguments. 
    trigger = pyqtSignal() 

    def connect_and_emit_trigger(self): 
     # Connect the trigger signal to a slot. 
     self.trigger.connect(self.handle_trigger) 

     # Emit the signal. 
     self.trigger.emit() 

    def handle_trigger(self): 
     # Show that the slot has been called. 

     print "trigger signal received" 
+0

Wow, più di un anno dopo! Risposta accettata (anche se la domanda è stata chiarita nei commenti sopra). – ADB

Problemi correlati