Hallo!
Warum kann man denn bei Slots keine Funktionsparameter übergeben? Gibt es da irgendwelche Gründe für? Könnte bald ne Prüfungsfrage für mich sein und ich hab irgendwie keine Ahnung
QT: Selbst definierte Signale
-
- User
- Beiträge: 6
- Registriert: Mittwoch 16. Juli 2008, 18:43
Also Beispiel:
Das geht:
Das nicht:
Grund?
Das geht:
Code: Alles auswählen
import sys
from PyQt4.Qt import *
def sayHello(s="x"):
print s
app = QApplication(sys.argv)
button = QPushButton("Sag Hallo", None)
QObject.connect(button, SIGNAL('clicked()'), sayHello)
button.show()
sys.exit(app.exec_())
Code: Alles auswählen
QObject.connect(button, SIGNAL('clicked()'), sayHello("Hallo"))
Ein Name gefolgt von Runden Klammern bedeutet das Objekt, das an den Namen gebunden ist, wird aufgerufen. Wenn Du also ``say_hello('Hello')`` schreibst, dann wird die Funktion `say_hello()` aufgerufen und an ihre Stelle tritt der Rückgabewert. Also ganz normales Verhalten von Funktionen.
-
- User
- Beiträge: 6
- Registriert: Mittwoch 16. Juli 2008, 18:43
Aber genau dieser aufruf mit parameter geht ja nicht.
Doch natürlich geht der. Warum sollte er nicht? Wobei wir vielleicht mal "gehen" definieren sollten. Er wird ausgeführt und das Ergebnis des Aufrufs wird dann als drittes Argument für den Aufruf von `connect()` verwendet. Anscheinend nicht das was Du erwartest. Warum auch immer, denn Python verhält sich da relativ einfach und konsequent.
Code: Alles auswählen
import sys
from PyQt4.Qt import *
def sayHello(s="x"):
print s
app = QApplication(sys.argv)
button = QPushButton("Sag Hallo", None)
QObject.connect(button, SIGNAL('clicked()'), lambda: sayHello('Hello'))
button.show()
sys.exit(app.exec_())
-
- User
- Beiträge: 6
- Registriert: Mittwoch 16. Juli 2008, 18:43
In Python bin ich ja fit, nur QT ist mir fremd, ich steh da irgendwie auf dem schlauch.
also wenn ich lambda:sayhello(...) aufrufe wird die funktion aufgerufen und ohne lambda das objekt sayhello oder wie muss ich das verstehen?
also wenn ich lambda:sayhello(...) aufrufe wird die funktion aufgerufen und ohne lambda das objekt sayhello oder wie muss ich das verstehen?
Nein, bist du nicht. Dir ist nicht mal klar, was ein Funktionsaufruf ist, und was deine Syntax bewirkt hat.pythonesque hat geschrieben:In Python bin ich ja fit
Dein Problem hat nichts mit Qt zu tun, sondern ist in deinem Unverständnis von Funktionsaufrufen begründet.nur QT ist mir fremd, ich steh da irgendwie auf dem schlauch.
lambda erzeugt eine neue, anonyme Funktion, die das Ergebnis des inneren Funktionsaufrufs zurückgibt. Ohne lambda wird die Funktion direkt aufgerufen, so dass die "connect"-Methode als drittes Argument einen String erhält.also wenn ich lambda:sayhello(...) aufrufe wird die funktion aufgerufen und ohne lambda das objekt sayhello oder wie muss ich das verstehen?
-
- User
- Beiträge: 6
- Registriert: Mittwoch 16. Juli 2008, 18:43
Aber wo liegt denn jetzt genau der unterschied ob ich nur sayhello oder sayhello("adf") schreibe? mit sayhello geht es ja.
Danke für deine Geduld ...
Danke für deine Geduld ...
sayhello ist die Funktion. sayhello(...) führt die Funktion aus und liefert irgend einen Rückgabewert. Spiel damit mal im interaktiven Interpreter rum, dann wird Dir der Unterschied sicherlich deutlicher.
-
- User
- Beiträge: 6
- Registriert: Mittwoch 16. Juli 2008, 18:43
Danke, jetzt hab ichs