PyQt4 Signale und slots
Schreibe ich meine erste Python-app mit PyQt4. Ich habe ein Hauptfenster und einen Dialog-Klasse, die ein Teil der MainWindow-Klasse:
self.loginDialog = LoginDialog();
Ich verwenden, slots und Signale. Hier ist eine Verbindung, die in MainWindow:
QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL("aa(str)"), self.login)
Und ich versuche zu emittieren signal innerhalb der Dialog-Klasse (ich bin sicher, es emittiert wird):
self.emit(QtCore.SIGNAL("aa"), "jacek")
Leider Steckplatz wird nicht aufgerufen. Ich habe versucht, ohne Argumente als gut, verschiedene Stile zu emittieren signal. Keine Fehler, keine Warnungen im code. Was könnte das problem sein?
InformationsquelleAutor Jacek | 2010-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie nicht verwenden das gleiche signal, wenn die emittierenden und anschließen.
QtCore.SIGNAL("aa(str)")
ist nicht das gleiche wieQtCore.SIGNAL("aa")
. Müssen die Signale haben die gleiche Signatur. By the way, wenn Sie definieren Ihre eigenen Signale, nicht definieren die Parameter. Gerade write-SIGNAL('aa'), da die Definition der Parameter ist eine Sache von C++ - und Python-version von Qt nicht brauchen.Also es sollte wie folgt Aussehen:
und wenn Sie übergeben Sie einen Parameter in Strahlen, Ihre login-Methode muss akzeptieren, diese Parameter. Überprüfen Sie, ob das hilft 🙂
Aber funktioniert es jetzt oder hast du noch ein problem?
Ich nicht funktioniert.
Könnte Sie post ein paar mehr Codes? Vielleicht ist das ganze snippet. Dann kann ich versuchen, Ihnen zu helfen.
Ich würde dankbar sein. Der code ist verfügbar hier: github.com/jbajor/Pwitter . Code habe ich Probleme mit: ptwitt_win.py, line 83-98, ptwitter_login.py, Zeile 54-58.
InformationsquelleAutor gruszczy
Gibt es einige Begriffe geklärt werden
[QT signal & slot] VS [Python-signal & slot]
Alle vordefinierten Signale & Spielautomaten zur Verfügung gestellt von pyqt und umgesetzt werden, die von QT ist c++ - code. Wenn Sie möchten, um eine benutzerdefinierte signal & slot-in Python, es ist ein python-signal & Steckplatz. Daher gibt es vier Fällen zu der ein signal abgibt, um einen slot:
Den code unten zeigt, wie eine Verbindung für diese vier verschiedenen scnarios
Fazit ist --
Signal Unterschrift für Python-signal unterscheiden sich von der QT-signal, dass er nicht die Klammern übergeben werden können, die python-Datentypen beim emittieren. Die Python-signal wird erzeugt, wenn Sie emittieren.
Slot gibt es drei Formen von Signaturen.
Nummer 1 & 2 sind verfügbar für Python-Steckplatz, während die Nummer 2 & 3 sind verfügbar für die QT-slot. Es ist klar, dass sich neben QT vordefinierten Steckplatz, python-callable-Funktion/Methoden ist qulified ein Python-slot.
Diese Punkte werden in Summerfield ' s Artikel über Signale und Slots.
[Alten Stil qt signal & slot] VS [neuen style qt-singal & slot]
Gut, alle die obige Beschreibung basiert auf den alten Stil pyqt signal & Steckplatz. @Idan K vorgeschlagen, es gibt eine alternative neue Stil, Dinge zu tun, vor allem für die Python-signal. Finden Sie hier für mehr.
Muss Zustimmen, eine der besten! Danke!
InformationsquelleAutor rodney
Überprüfte ich den code und wie es aussieht, ist das problem in der Art und Weise, wie Sie eine Verbindung herstellen Ihr signal
Sie aussenden des Signals in Ui_Dialog Klasse
selbst.emit(QtCore.SIGNAL("aa()"))
verbinden Sie das signal in Ui_MainWindow die Methode setupUi durch den Aufruf
QtCore.QObject.connect(self.loginDialog.ui, QtCore.SIGNAL("aa()"), self.login)
Hinweis zuerst parameter geändert wird, um selbst.loginDialog.ui; Ihre ursprüngliche Aufruf verbinden, war die Verwendung von selbst.loginDialog, die von der LoginDialog geben, in der Erwägung, dass signal von der Ui_Dialog der Klasse der ui-Eigenschaft der LoginDialog. Nach dieser änderung mit der login-Methode des Ui_MainWindow bekam aufgerufen
hoffe das hilft, Grüße
InformationsquelleAutor serge_gubenko
Was @bialix vorgeschlagen sollte gearbeitet haben, aber versuchen Sie eine alternative Art der Verbindung:
Für eine detailliertere Erklärung, wie die Signale/slots arbeiten in PyQt würde ich vorschlagen, dass man durch Sie in der Dokumentation, speziell dieser Abschnitt.
Versuchen Sie, erstellen ein script mit dem code, den ich geschrieben habe, und rufen Sie connect_to_signal auf ein Foo-Objekt ist, sehen Sie keine Ausgabe?
InformationsquelleAutor Idan K
Wie bereits von gruszczy Sie die gleichen QtCore.SIGNAL('xxx') zur Verbindung des Signals und zum emittieren. Ich denke auch, man sollte die Verwendung von Qt-Typen, in der Argumente-Liste signal-Funktion. E. g.:
Und dann Strahlen mit:
Manchmal ist es sinnvoll zu definieren, signal nur einmal als Globale variable, und verwenden Sie es an anderer Stelle:
Welche version von PyQt Sie verwenden?
PyQt4 263682 (zurückgegeben von QtCore.PYQT_VERSION)
QtCore.PYQT_VERSION_STR zeigen Sie menschlich-lesbaren string. Aber es scheint, Sie sind mit 4.6.2. Ich weiß nicht, warum es bei Ihnen nicht funktioniert.
InformationsquelleAutor bialix
Habe ich nicht verwendet, PyQT4, aber werfen Sie einen Blick auf hier.
Sollte QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL('aa()'), self, QtCore.SLOT('login()'))
Du hast Recht Bialix. Leider habe ich noch bekommen: QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL('aa()'), self, QtCore.SLOT('login()')) Absturz mit Laufzeitfehler: Basiswert C/C++ - Objekt wurde gelöscht
InformationsquelleAutor erelender
Aussieht, vermissen Sie die "SLOT" - Teil in Ihr connect-Aufruf.
Hier ist ein Beispiel :
dann
Hoffe, das hilft !
Oh, ok ! Mein bad...
Unfortunataly, funktioniert es nicht. QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL('aa'), QtCore.SIGNAL('login')) TypeError: QObject.connect(): Argumente, die nicht mit irgendeinem überladenen nennen: überlast 1: argument 3 hat unerwartete type 'str' überlast 2: argument 3 hat unerwartete type 'str' überlast 3: argument 2 hat unerwartete type 'str' trotzdem Danke 🙂
InformationsquelleAutor Andy M