Hello World mit einem Endeknopf
Im folgenden wird das obige Beispiel mit einem Knopf, der das
Programm beenden soll, erweitert. In Qt werden Knöpfe durch die
Klasse QPushButton, welche eine Unterklasse von
QButton, welche wiederum von QWidget abgeleitet worden ist,
repräsentiert.
Das Erzeugen eines Buttons unterscheidet sich nicht sehr von der Art
wie das Label im letzten Beispiel hinzugefügt wurde. Viel
interessanter ist, dass man an diesem Beispiel sehen kann, wie Qt
Benutzeraktivitäten verarbeitet.
helloqt2.cpp
1 #include <qapplication.h>
2 #include <qlabel.h>
3 #include <qpushbutton.h>
4
5 int main(int argc, char* argv[])
6 {
7 QApplication myApp(argc, argv);
8
9 QWidget* myWidget = new QWidget();
10 myWidget->setGeometry(400, 300, 120, 90);
11
12 QLabel* myLabel = new QLabel("Hello world", myWidget);
13 myLabel->resize(80, 30);
14
15 QPushButton* myQuitButton = new QPushButton("Quit", myWidget);
16 myQuitButton->setGeometry(10, 50, 100, 30);
17 QObject::connect(myQuitButton, SIGNAL(clicked()), &myApp, SLOT(quit()));
18
19 myApp.setMainWidget(myWidget);
20 myWidget->show();
21
22 return myApp.exec();
23 }
Um mehr als ein Widget darzustellen, mussten einige Dinge
verändert werden. So dient jetzt ein drittes GUI-Element als
Container für den Text und den Knopf. Dieses zusätzliche
Element trägt den Namen myWidget und ist eine Instanz
der Klasse QWidget. Das bedeutet es hat keinerlei spezielle
Eigenschaften, kennt aber alle generellen Widgetfunktion wie
Verschieben und Vergrößern.
In den Konstruktoren von QLabel und QPushButton
wird myWidget als zweiter Parameter mit
übergeben. Dies ist sehr wichtig, denn dadurch wird
myWidget zum Elternwidget der beiden GUI-Elemente.
Ein weiterer Unterschied ist, dass die Größen und
Positionen der Widgets jetzt explizit mit der Methode
setGeometry() gesetzt werden. Die vier Parameter sind
horizontale Position, vertikale Position, Breite und
Höhe in Pixeln. Während die Positionsangaben
für das Label und den Button relativ zum Elternwidget angegeben
werden, beziehen sich diese Angaben für das Main widget
auf den gesamten Bildschirm.
Zeile 17 scheint auf den ersten Blick ziemlich verwirrend. Sie wird
im nächsten Abschnitt 'Signals und Slots' genauer
besprochen. Erstmal nur soviel: Immer wenn ein Knopf gedrückt
wird, sendet er ein Signal aus (in diesem Fall ein
clicked()-Signal. Dieses Signal bedeutet in etwa soviel wie
'An alle die es interessiert: Jemand hat mich angeklickt. Mach
was immer Du willst mit dieser Information'. Andere
Programmteile können sich nun zu diesem Widget connecten
und werden dann über jeden Klick informiert. Um sich mit einem
Signal verbinden zu können, muss ein Slot zur
Verfügung gestellt werden, welcher dann mit dem Signal
verbunden wird. In der Slotmethode kann alles mögliche gemacht
werden, um das Ereignis zu verarbeiten. In diesem Fall wird der Slot
quit() der QApplication aufgerufen und das
Programm dadurch beendet.