QT: Selbst definierte Signale

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
pythonesque
User
Beiträge: 6
Registriert: Mittwoch 16. Juli 2008, 18:43

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:
pythonesque
User
Beiträge: 6
Registriert: Mittwoch 16. Juli 2008, 18:43

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:
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.
pythonesque
User
Beiträge: 6
Registriert: Mittwoch 16. Juli 2008, 18:43

Aber genau dieser aufruf mit parameter geht ja nicht.
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.
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.
pythonesque
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. :oops:

also wenn ich lambda:sayhello(...) aufrufe wird die funktion aufgerufen und ohne lambda das objekt sayhello oder wie muss ich das verstehen?
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.
pythonesque
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 ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
pythonesque
User
Beiträge: 6
Registriert: Mittwoch 16. Juli 2008, 18:43

Danke, jetzt hab ichs :)
Antworten