2013-07-10 12 views
7

Ich habe versucht, einen Weg zu finden, um den GUI-Thread von einem Python-Thread außerhalb von Main zu aktualisieren. Die PyQt5 docs on sourceforge haben gute Anweisungen, wie dies zu tun ist. Aber ich kann immer noch nicht alles zum Laufen bringen.PyQt5 Signale und Slots 'QObject hat kein Attribut' Fehler

Gibt es eine gute Möglichkeit, die folgende Ausgabe von einer interaktiven Sitzung zu erklären? Sollte es nicht möglich sein, die emit-Methode für diese Objekte aufzurufen?

>>> 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' 

und

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

und

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

gleiche wie hier: [PyQt5 in welchem ​​Modul wird die emit Methode gefunden?] (Http://stackoverflow.com/questions/17581506/pyqt5-in-what-module-is-the-emit-method -found) - nur __bound__ Signale haben eine 'emit' Methode. ('obj.sig = pyqtSignal()' ist immer noch ein ungebundenes Signal) – mata

+0

@mata: Ja, ich nahm diese Beispiele aus den PyQt5-Dokumenten bei sourceforge. Wie Sie [hingewiesen] (http://stackoverflow.com/questions/17581506/pyfqt5-in-what-module-is-the-emit-method-found), ist die Emit-Methode für ein gebundenes Signal, dh es ist ein Mitglied einer Klasse, die von QObject erbt. Ich habe nicht bemerkt, dass ich das in der oben eingefügten interaktiven Sitzung nicht gemacht habe. – ADB

+0

@ mata: Nur neugierig, was wäre der Nutzen von ** obj.sig = pyqtSignal() **, wie im dritten Beispiel oben? – ADB

Antwort

15

folgenden Wörter und Codes sind in PyQt5 docs.

Neue Signale sollten nur in Unterklassen definiert werden von QObject.They Teil der Klassendefinition sein muss und nicht dynamisch hinzugefügt werden können als Klassenattribute nach der Klasse definiert wurde.

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, mehr als ein Jahr später! Antwort akzeptiert (obwohl die Frage in den obigen Kommentaren geklärt wurde). – ADB

Verwandte Themen