Seite 1 von 1
Signals&&Slots vs. Event Handler
Verfasst: 28. August 2008 01:57
von J!M!
Hallo!
Worin besteht der Unterschied im Zweck zwischen Signals&&Slots und Eventhandler? D.h. anders gefragt: Was kann das Konzept Signals&&Slots, was das Eventhandling nicht kann?
GreeZ J!M!
Verfasst: 28. August 2008 07:41
von CaptnChaos
Signals und Slots benutzt man für interne Kommunikation. Beispielsweise Daten zwischen zwei Klassen in Echtzeit austauschen. Events werden zur Komminukation mit dem System genutzt. Beispielsweise QMouseEvent oder QKeyEvent.
Verfasst: 28. August 2008 20:32
von J!M!
ok danke.

Doch noch ne Frage.
Verfasst: 28. August 2008 23:19
von J!M!
Öhm, doch noch ein paar Fragen:
1. Wenn z.B. QPushButton das Signal clicked() besitzt, dann könnte i doch auswählen ob i in diesem Falle mit Signal&&Slots oder mit MousePressEvent() arbeite oder nicht?
2. (bezüglich Event Handlern in Qt): Beispiel -> Buttons sind generell dazu da, um geklickt zu werden, d.h. das MousePressEvent ist das Standardereignis, somit ist MousePressEvent() der Standard Event Handler. Nun hat aber jeder Programmierer unterschiedliche Vorhaben, was beim Klicken des Buttons geschieht werden soll, d.h. er möchte den Inhalt des MousePressEvent() verändern. Die Frage:
Gibt es eine Möglichkeit den Inhalt des Event Handlers zu modifzieren, ohne dafür extra selber eine neue von QPushButton abgeleitete Klasse erstellen zu müssen? Denn dann müsste man ja praktisch gesehen für jeden Button den man verwendet, eine neue Klasse erstellen. Denn ein Button, der nix macht, wenn man draufklickt ist ya nutzlos.
Grüße J!M!
Verfasst: 28. August 2008 23:42
von CaptnChaos
dafür sind doch die signals and slots da...
du machst
Code: Alles auswählen
connect(pushButton, SIGNAL(clicked()), this, SLOT(buttonSlot()));
buttonSlot ist in deiner Gui-Klasse unter public slots: deklariert und enthält das was passieren soll wenn das Button geklickt wird.
Aber les dir dazu mal die doku durch.
Verfasst: 29. August 2008 00:02
von -=Freaky=-
KernelPanic hat geschrieben:dafür sind doch die signals and slots da...
du machst
Code: Alles auswählen
connect(pushButton, SIGNAL(clicked()), this, SLOT(buttonSlot()));
buttonSlot ist in deiner Gui-Klasse unter public slots: deklariert und enthält das was passieren soll wenn das Button geklickt wird.
Aber
lies dir dazu mal die doku durch.
seh ich auch so, wobei du natuerlich aus langeweile sicher auch mit MousePressEvent da rangehen koenntest ...
mfg,
julian
Verfasst: 29. August 2008 00:14
von J!M!
ok ersma danke für die schnellen antworten.
also zu meiner 1. frage, wenn i richtig verstanden habe, heißt es: "ya, in qt kann man bei SystemEvents je nach möglichkeit auch mit Signal&&Slots arbeiten statt Events."
Wenn i es doch falsch verstanden haben sollte, bitte korrigieren. i bin nämlich qt einsteiger, und will keine missverstängnisse bei den grundkenntnissen haben.
und 2.... hmm. ok, seh mir ersma die Doku an.
Grüße J!M!
Verfasst: 29. August 2008 00:40
von J!M!
Ah, ok.

:) GutGut.
Hab grad noch ne Seite gefunden, welche eine Vereinfachung des Connectens von Signal&&Slots beschreibt: Einfach on_ELEMENT_SIGNAL() unter "Slot" deklarieren, bspw. on_QPushButton_clicked(). Hömm... Gibt es irgendeinen Nachteil dabei? Denn ansonsten versteh i nicht, warum diese Art kaum in den Examples zu finden ist und stattdessen die ellenlange Art und Weise mit connect() verwendet wird.
Und... Die Qt-Klassen haben ja bereits, selbstverständlich, Elementfunktionen. Wenn i z.B. möchte, dass beim Klick auf ein Button ein Fenster angezeigt werden soll, kann i dann direkt das Signal QPushButton::clicked() mit QMainWindow::show() als SLOT verbinden? Denn in der Doku zu Signals&&Slots steht ya, dass Slots durchaus in gewisser Hinsicht wie normale Memberfunctions behandelt werden....
Oder muss in extra eine SLOT-Funktion anlegen, die dann ihrerseits erst QMainWindow::show() aufruft?
Grüße J!M!
Verfasst: 29. August 2008 00:57
von CaptnChaos
Mach mal das Qt Tutorial...
Ist bei der Doku dabei.
Verfasst: 29. August 2008 01:44
von J!M!
okidoke.
aber um nochmal zurückzukommn. wenn i iwann auf einen fall treffen sollte, dass in einer klasse noch kein signal für ein systemevent deklariert wurde, dann muss i ya einen event handler benutzen. und um den inhalt des eventhandlers zu modifzieren muss i dann selbst eine neue abgeleitete funktion erstellen?
MfG J!M!