Seite 1 von 1

QT: Selbst definierte Signale

Verfasst: Mittwoch 16. Juli 2008, 18:47
von pythonesque
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 :oops:

Verfasst: Donnerstag 17. Juli 2008, 11:19
von pythonesque
Also Beispiel:

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_())
Das nicht:

Code: Alles auswählen

QObject.connect(button, SIGNAL('clicked()'), sayHello("Hallo"))
Grund? :shock:

Verfasst: Donnerstag 17. Juli 2008, 11:45
von BlackJack
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.

Verfasst: Donnerstag 17. Juli 2008, 16:52
von pythonesque
Aber genau dieser aufruf mit parameter geht ja nicht.

Verfasst: Donnerstag 17. Juli 2008, 17:37
von BlackJack
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.

Verfasst: Donnerstag 17. Juli 2008, 19:03
von lunar

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_())
Du solltest aber erstmal Tutorials lesen und die Grundlagen von Python verstehen, bevor du GUI Programmierung betreibst.

Verfasst: Donnerstag 17. Juli 2008, 19:43
von pythonesque
In Python bin ich ja fit, nur QT ist mir fremd, ich steh da irgendwie auf dem schlauch. :oops:

also wenn ich lambda:sayhello(...) aufrufe wird die funktion aufgerufen und ohne lambda das objekt sayhello oder wie muss ich das verstehen?

Verfasst: Donnerstag 17. Juli 2008, 19:46
von lunar
pythonesque hat geschrieben:In Python bin ich ja fit
Nein, bist du nicht. Dir ist nicht mal klar, was ein Funktionsaufruf ist, und was deine Syntax bewirkt hat.
nur QT ist mir fremd, ich steh da irgendwie auf dem schlauch. :oops:
Dein Problem hat nichts mit Qt zu tun, sondern ist in deinem Unverständnis von Funktionsaufrufen begründet.
also wenn ich lambda:sayhello(...) aufrufe wird die funktion aufgerufen und ohne lambda das objekt sayhello oder wie muss ich das verstehen?
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.

Verfasst: Donnerstag 17. Juli 2008, 19:59
von pythonesque
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 ...

Verfasst: Donnerstag 17. Juli 2008, 20:30
von EyDu
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.

Verfasst: Donnerstag 17. Juli 2008, 20:57
von pythonesque
Danke, jetzt hab ichs :)