2013-07-10 29 views
7

Próbowałem znaleźć sposób na aktualizację wątku GUI z wątku Python poza głównym. The PyQt5 docs na sourceforge mają dobre instrukcje, jak to zrobić. Ale nadal nie mogę sprawić, żeby wszystko działało.PyQt5 Sygnały i sloty "QObject nie ma atrybutu" error

Czy istnieje dobry sposób na wyjaśnienie następującego wyniku sesji interaktywnej? Czy nie powinien istnieć sposób na wywołanie metody emisji na tych obiektach?

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

i

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

i

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

samo jak tutaj: [PyQt5 w jakim znajduje się moduł metoda Emit?] (Http://stackoverflow.com/questions/17581506/pyqt5-in-what-module-is-the-emit-method -found) - tylko sygnały __bound__ mają metodę 'emit'. ("obj.sig = pyqtSignal()" nadal jest sygnałem niezwiązanym) – mata

+0

@mata: Tak, brałem te przykłady z dokumentacji PyQt5 na sourceforge. Jak [zauważyłeś] (http://stackoverflow.com/questions/17581506/pyfqt5-in-what-module-is-the-emit-method-found), metoda emitowania dotyczy sygnału związanego, tzn. członek klasy dziedziczącej z QObject. Nie zdawałem sobie sprawy, że nie robiłem tego w sesji interaktywnej wklejonej powyżej. – ADB

+0

@ mata: Po prostu ciekawa, jaka byłaby użyteczność ** obj.sig = pyqtSignal() **, jak w trzecim przykładzie powyżej? – ADB

Odpowiedz

15

następujące słowa i kody są w PyQt5 docs.

Nowe sygnały powinny być określone tylko w podklas z QObject.They musi być część definicji klasy i nie może być dynamicznie dodawane jako atrybuty klasy po klasa została zdefiniowana.

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, ponad rok później! Odpowiedź została zaakceptowana (mimo że pytanie zostało wyjaśnione w komentarzach powyżej). – ADB