anda_skoa
08-02-2003, 20:17
Lektion 2
Autor: anda_skoa
Der Button aus Lektion 1 hat noch keine Funktion.
Es wäre doch fein, wenn ein Klick auf den Button das Fenster schliessen
würde.
Das geht ganz leicht, mit nur einem weiteren Befehl:
#include <qapplication.h>
#include <qpushbutton.h>
int main( int argc, char* argv[] )
{
QApplication app( argc, argv );
QPushButton helloworld( "Hello World", 0 );
helloworld.resize( 100,30 );
app.setMainWidget( &helloworld );
QObject::connect(&helloworld, SIGNAL(clicked()), &app, SLOT(quit()));
helloworld.show();
return app.exec();
}
Betrachten wir die zusätzliche Zeile:
QObject::connect(&helloworld, SIGNAL(clicked()), &app, SLOT(quit()));
Wir sehen im wesentlichen zwei Sachen:
a) den Aufruf der offensichtlich statische Methode connect der Klasse
QObject
b) die Anwendung von zwei Makros: SIGNAL und SLOT
QObject (http://doc.trolltech.com/3.0/qobject.html) ist die Basis
aller Klassen, die in Qt an Events beteilgt sind.
In der Sektion "Static Public Members" finden wir auch die oben benutze
Funktion:
bool connect ( const QObject * sender, const char * signal, const QObject *
receiver, const char * member )
Was macht nun diese Methode?
Sie verbindet ein Signal eines Senderobjektes mit einem Slot eines
Empfängerobjektes.
Signale und Slots sind eine Eigenheit von Qt.
Sie erlauben das verbinden zwei Objekten, ohne dass sich die beiden Partner
kennen müssen.
Nur der Verbinder muss beide kennen.
Signal und Slots sind eine Art lokales Event.
Jede QObject Subklasse kann Signale aussenden und Signale empfangen.
Wenn ein Signal nicht verbunden ist, verpufft es einfach.
Ein Signal kann mit mehreren Slots verbunden sein.
In diesem Fall werden alle Slots in zufälliger Reihenfolge aktiviert, also
ausgeführt.
In unserem Beispiel verknüpfen wir das Signal clicked() des QPushButtons mit
dem Slot quit() der QApplication Instanz.
Signale und Slots befinden sich in der Qt Dokumentation immer in eigene
Sektionen der jeweiligen Klassen.
clicked() ist in dem Fall nicht direkt in QPushButton sondern bereits in der
Basisklasse QButton (http://doc.trolltech.com/3.0/qbutton.html) deklariert.
Wie die leere Klammer andeutet, hat das Signal clicked() keinen
Parameter, transportiert also keine Daten.
Darum können wir es nur mit einem Slot verbinden, der keinen Parameter
erwartet.
Glücklicherweise ist quit() genau so ein Slot. :)
Die Parameter von Signal und Slot müssen immer in ihrem Typ übereinstimmen.
Das wird allerdings erst zur Laufzeit überprüft, der Compiler meldet also
keinen etwaigen Fehler. So etwas sieht man dann auf der Konsole, von der aus
das Programm gestarte wurde.
Dieser Effekt kann leicht demonstiert werden, wenn man clicked()
gegen toggled(bool) austauscht.
Unsere Programmzeile würde in diesem Fall so aussehen:
QObject::connect(&helloworld, SIGNAL(toggled(bool)), &app, SLOT(quit()));
Kompilierung
Die Kompilierung erfolgt wie in der ersten Lektion:
#> g++ -o lektion2 lektion2.cpp -Wall -I/usr/lib/qt-3.0.3/include -L/usr/lib/qt-3.0.3/lib -lqt-mt
Wenn das Programm nun ausgeführt wird, wird bei einem Klick auf den Button
das Programm beendet.
Durch den Klick sendet der Button sein clicked() Signal aus.
Anders als in Lektion 1 ist dieses Signal nun mit quit() der
QApplication verdunden. Darum wird von Qt diese Methode ausgeführt, was die
QApplication dazuveranlasst, sich zu beenden.
Experimente
Die Parameter von Signal und Slot müssen immer in ihrem Typ übereinstimmen.
Das wird allerdings erst zur Laufzeit überprüft, der Compiler meldet also
keinen etwaigen Fehler. So etwas sieht man dann auf der Konsole, von der aus
das Programm gestarte wurde.
Dieser Effekt kann leicht demonstiert werden, wenn man clicked()
gegen toggled(bool) austauscht.
Unsere Programmzeile würde in diesem Fall so aussehen:
QObject::connect(&helloworld, SIGNAL(toggled(bool)), &app, SLOT(quit()));
Bitte wieder abstimmen und kommentieren.
Danke,
_
Autor: anda_skoa
Der Button aus Lektion 1 hat noch keine Funktion.
Es wäre doch fein, wenn ein Klick auf den Button das Fenster schliessen
würde.
Das geht ganz leicht, mit nur einem weiteren Befehl:
#include <qapplication.h>
#include <qpushbutton.h>
int main( int argc, char* argv[] )
{
QApplication app( argc, argv );
QPushButton helloworld( "Hello World", 0 );
helloworld.resize( 100,30 );
app.setMainWidget( &helloworld );
QObject::connect(&helloworld, SIGNAL(clicked()), &app, SLOT(quit()));
helloworld.show();
return app.exec();
}
Betrachten wir die zusätzliche Zeile:
QObject::connect(&helloworld, SIGNAL(clicked()), &app, SLOT(quit()));
Wir sehen im wesentlichen zwei Sachen:
a) den Aufruf der offensichtlich statische Methode connect der Klasse
QObject
b) die Anwendung von zwei Makros: SIGNAL und SLOT
QObject (http://doc.trolltech.com/3.0/qobject.html) ist die Basis
aller Klassen, die in Qt an Events beteilgt sind.
In der Sektion "Static Public Members" finden wir auch die oben benutze
Funktion:
bool connect ( const QObject * sender, const char * signal, const QObject *
receiver, const char * member )
Was macht nun diese Methode?
Sie verbindet ein Signal eines Senderobjektes mit einem Slot eines
Empfängerobjektes.
Signale und Slots sind eine Eigenheit von Qt.
Sie erlauben das verbinden zwei Objekten, ohne dass sich die beiden Partner
kennen müssen.
Nur der Verbinder muss beide kennen.
Signal und Slots sind eine Art lokales Event.
Jede QObject Subklasse kann Signale aussenden und Signale empfangen.
Wenn ein Signal nicht verbunden ist, verpufft es einfach.
Ein Signal kann mit mehreren Slots verbunden sein.
In diesem Fall werden alle Slots in zufälliger Reihenfolge aktiviert, also
ausgeführt.
In unserem Beispiel verknüpfen wir das Signal clicked() des QPushButtons mit
dem Slot quit() der QApplication Instanz.
Signale und Slots befinden sich in der Qt Dokumentation immer in eigene
Sektionen der jeweiligen Klassen.
clicked() ist in dem Fall nicht direkt in QPushButton sondern bereits in der
Basisklasse QButton (http://doc.trolltech.com/3.0/qbutton.html) deklariert.
Wie die leere Klammer andeutet, hat das Signal clicked() keinen
Parameter, transportiert also keine Daten.
Darum können wir es nur mit einem Slot verbinden, der keinen Parameter
erwartet.
Glücklicherweise ist quit() genau so ein Slot. :)
Die Parameter von Signal und Slot müssen immer in ihrem Typ übereinstimmen.
Das wird allerdings erst zur Laufzeit überprüft, der Compiler meldet also
keinen etwaigen Fehler. So etwas sieht man dann auf der Konsole, von der aus
das Programm gestarte wurde.
Dieser Effekt kann leicht demonstiert werden, wenn man clicked()
gegen toggled(bool) austauscht.
Unsere Programmzeile würde in diesem Fall so aussehen:
QObject::connect(&helloworld, SIGNAL(toggled(bool)), &app, SLOT(quit()));
Kompilierung
Die Kompilierung erfolgt wie in der ersten Lektion:
#> g++ -o lektion2 lektion2.cpp -Wall -I/usr/lib/qt-3.0.3/include -L/usr/lib/qt-3.0.3/lib -lqt-mt
Wenn das Programm nun ausgeführt wird, wird bei einem Klick auf den Button
das Programm beendet.
Durch den Klick sendet der Button sein clicked() Signal aus.
Anders als in Lektion 1 ist dieses Signal nun mit quit() der
QApplication verdunden. Darum wird von Qt diese Methode ausgeführt, was die
QApplication dazuveranlasst, sich zu beenden.
Experimente
Die Parameter von Signal und Slot müssen immer in ihrem Typ übereinstimmen.
Das wird allerdings erst zur Laufzeit überprüft, der Compiler meldet also
keinen etwaigen Fehler. So etwas sieht man dann auf der Konsole, von der aus
das Programm gestarte wurde.
Dieser Effekt kann leicht demonstiert werden, wenn man clicked()
gegen toggled(bool) austauscht.
Unsere Programmzeile würde in diesem Fall so aussehen:
QObject::connect(&helloworld, SIGNAL(toggled(bool)), &app, SLOT(quit()));
Bitte wieder abstimmen und kommentieren.
Danke,
_