PyQt4 Signale und Slots

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
janosh22
User
Beiträge: 6
Registriert: Samstag 27. Dezember 2014, 13:06

Hallo.

Ich bin gerade dabei mich in das Thema GUI mit PyQt einzuarbeiten. Habe mir dafür das Buch "PyQt und PySide" von Peter Bouda gekauft.
Beim abarbeiten der Lektion 1.6 "Signale und Slots", kommt wiedermal eine Frage auf.
Hier ein Auszug des Beispiels aus dem Buch:

Code: Alles auswählen

self.buttonTextAktualisieren = QtGui.QPushButton(u"Aktualisieren")
self.editText = QtGui.QLineEdit()
self.buttonTextAktualisieren.clicked.connect(self.text_aktualisieren)

@QtCore.pyqtSlot()
def text_aktualisieren(self):
     self.labelHalloWelt.setText(self.editText.text())
Ich arbeite als Anfänger noch stark mit der Autovervollständigung und gehe davon aus, dass verfügbare Methoden auch angezeigt werden.
In Zeile 3 soll das Signal clicked mit dem Slot text_aktualisieren verbunden werden.
Es wird jedoch keine Methode connect angeboten und die Inspection des Codes meldet folgendes:
Cannot find reference 'connect' in 'function'
Das Programm wird jedoch ohne Fehlermeldung ausgeführt.
Ich habe dann probehalber mal die Codezeile folgendermaßen ersetzt:

Code: Alles auswählen

QtCore.QObject.connect(self.buttonTextAktualisieren, QtCore.SIGNAL("clicked()"), self.text_aktualisieren)
Das funktioniert auch und wird nicht von der Code-Inspection moniert.
Kann mich jemand erleuchten?

mfg Jan
Ich verwende die IDE PyCharm 4.0, PyQt4, Python 3.4
BlackJack

@janosh22: Die Erleuchtung wäre wohl: Verlass Dich in dynamisch typisierten Programmiersprachen besser nicht zu sehr auf statsiche Analyse von Code. Das funktioniert halt nur bedingt.
janosh22
User
Beiträge: 6
Registriert: Samstag 27. Dezember 2014, 13:06

@BlackJack: Danke für die Antwort.
Soll das jetzt heißen, auch wenn die Methode connect nicht angezeigt wird, lass dich nicht verwirren es ist richtig so?
Ich verwende die IDE PyCharm 4.0, PyQt4, Python 3.4
BlackJack

@janosh22: Wenn sie Dokumentiert ist und tatsächlich vorhanden ist, dann wäre es doch komisch sie nicht zu verwenden.
janosh22
User
Beiträge: 6
Registriert: Samstag 27. Dezember 2014, 13:06

@BlackJack: Mein Problem ist, als Anfänger weiß ich ja nicht ob die Methode vorhanden ist.
Habe jetzt aber die PyQt4 Reference zurate gezogen und dort steht, dass connect() die Methode eines gebundenen Signals ist.

Habe noch eine Frage zu zwei Codezeilen
die folgende Codezeile ändert den Inhalt von labelHalloWelt wenn sich editText ändert

Code: Alles auswählen

self.editText.textChanged.connect(self.labelHalloWelt.setText)
die folgende Codezeile bewirkt hingegen nichts.

Code: Alles auswählen

QtCore.QObject.connect(self.editText, QtCore.SIGNAL("textChanged()"), self.labelHalloWelt.setText)
kannst du es mir erklären?
mfg Jan
Ich verwende die IDE PyCharm 4.0, PyQt4, Python 3.4
BlackJack

@janosh22: Es gibt kein 'textChanged()'-Signal. Versuch's mal mit 'textChanged(QString)'. Einer der Vorteile wenn man die `connect()`-Methode auf dem Signal-Objekt verwendet: man kann nicht aus versehen Signale verbinden die es nicht gibt. :-)
janosh22
User
Beiträge: 6
Registriert: Samstag 27. Dezember 2014, 13:06

@BlackJack: Hab vielen Dank , bin durch deine prompte Hilfe heute ein gutes Stück vorangekommen.
Habe es mir soeben nochmal in der QLineEdit Class Reference angesehen.

erstmal schönes Wochenende
Jan
Ich verwende die IDE PyCharm 4.0, PyQt4, Python 3.4
Antworten