Autoren: tuxipuxi, anda_skoa

Beipieldatei: lektion1.cpp

Code:
#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 );

    helloworld.show();

    return app.exec();

}
Nun betrachten wir das Programm Zeile für Zeile:

Code:
#include <qapplication.h>
Dieser Header deklariert die Klasse QApplication.
Eine Instanz der Klasse QApplication wird benötigt, wenn das Programm das Eventhandling von
Qt benutzen möchte.
Events benötigt man wenn man
[list=a][*] Widgets benutzt, d.h. wenn man eine GUI machen möchte[*] Sockets benutzt, d.h. wenn man Netzwerkkommunikation machen möchte[*] QProcess benutzt, d.h. wenn man andere Programme als Kindprozesse starten möchte[/list=a]

In diesem Fall trifft (a) zu.

Code:
#include <qpushbutton.h>
Dieser Header deklariert die Klasse QPushButton.
Ein QPushButton ist ein klassischer Button.

Code:
int main( int argc, char *argv[] )
Beginn der normalen main Funktion eines C++ Programms.

Code:
QApplication app( argc, argv );
Wir erzeugen unsere QApplication Instanz und verwenden als Parameter die Kommandozeilen Argumente
des Programms.
Qt definiert ein paar mögliche Argumente und benutzt sie, wenn sie in argv enthalten sind.
Die verbleibenden Argumente verhält man über die Methoden argc() bzw. argv() der QApplication Instanz.

Code:
QPushButton  helloworld( "Hello World", 0 );
Dies erzeugt einen QPushButton, dessen Eigenschaften wir mit Hilfe seiner Methoden ändern können.
Das erste Argument gibt den Text an, der im QPushButton stehen soll, der zweite das Parent Widget.
Das Parent Widget ist das GUI Element, in dem das neue Widget enthalten sein soll.
Hier ist der Parent 0, d.h. der Button ist hat keinen Parent.

Hat ein QObject (das gilt nicht nur für QWidgets) ein Parent QObject, dann wird der Parent alle seine
Kindobjekte löschen, wenn er selbst gelöscht wird.
Das ist vorallem bei Widgets praktisch, weil man nicht alle Elemente eines Fenster einzeln löschen muss,
sondern es reicht, das Fenster zu löschen.

Code:
helloworld.resize( 100,30 );
Die Methode resize eine QWidget ändert seine Größe. Die Parameter sind die Breite (width) und die Höhe (height).
Der Button wird also auf 100 Pixel Breite und 30 Pixel Höhe gesetzt.

Code:
app.setMainWidget( &helloworld );
Setzt unseren QPushButton helloworld als MainWidget der Applikation. Normalerweise hat jede Qt GUI-Applikation ein MainWidget.
Wird dieses geschlossen, beendet sich auch die QApplication.

Code:
helloworld.show();
Ein Widget ist nach seiner Erzeugung nicht automatisch sichtbar.
Es muss erst die Methode show aufgerufen werden.
Widgets die eine Parent haben, werden sichtbar, wenn der Parent sichtbar wird, außer der Parent
war bei Erzeugung des Kindwidgets bereits sichtbar.

Code:
return app.exec();
Hier übergeben wir der Qt-Application ( app ) das Kommando.
Sobald diese beendet wird, liefert app einen Rückgabewert und die main Funktion wird ebenfalls beendet.


Kompilierung:

Um diese Datei zu kompilieren, braucht man ein paar Argumente für den C++ Compiler.
Da wir Qt Headerdateien verwenden, brauchen wir den Pfad an dem sie liegen.
Da wir anschliessend mit der Qt Bibliothek linken wollen, brauchen wir auch den Pfad der Bibliothek.

Um die beiden Pfad zu erhalten, rufen wir locate auf

#> locate qapplication.h
/usr/lib/qt-3.0.3/include/qapplication.h
/usr/share/doc/qt-devel-3.0.3/html/qapplication.html
Das zweite ist der Pfad der Dokumentation, aber den brauchen wir nicht.
Unsere Qt Header sind hier also in /usr/lib/qt-3.0.3/include

#> locate libqt
/usr/lib/qt-3.0.3/lib/libqt-mt.so.3
/usr/lib/qt-3.0.3/lib/libqt-mt.so.3.0
/usr/lib/qt-3.0.3/lib/libqt-mt.so.3.0.3
/usr/lib/qt-3.0.3/lib/libqt.so.3
/usr/lib/qt-3.0.3/lib/libqt.so.3.0
/usr/lib/qt-3.0.3/lib/libqt.so.3.0.3
/usr/lib/qt-3.0.3/lib/libqt-mt.so
/usr/lib/qt-3.0.3/lib/libqt.so
Der Pfad zur Bibliothek ist also /usr/lib/qt-3.0.3/lib
Die Qt Bibliothek liegt hier sowohl mit (libqt-mt.so) Thread Unterstützung vor, also auch ohne (libqt.so).
Welche von beiden benutzt wird, ist für unser Beispiel nicht wichtig.

(Die Pfade sind von System zu System unterschiedlich)

Der Aufruf lautet nun wie folgt:
#> g++ -o lektion1 lektion1.cpp -Wall -I/usr/lib/qt-3.0.3/include -L/usr/lib/qt-3.0.3/lib -lqt-mt
Zur Erklärung:
  • g++ : der C++ Compiler unter Linux.
  • -o lektion1 : der Name, den das Programm haben soll
  • lektion1.cpp : Unsere Quelltextdatei
  • -Wall : aktiviert alle Warnung des Kompilers
  • -I/usr/lib/qt-3.0.3/include: Angabe eines Pfades für Headerdateien (das I ist ein großes i)
  • -L/usr/lib/qt-3.0.3/lib : Angabe eines Pfads für Bibliotheken
  • -lqt-mt : die Bibliothek, mit der unser Programm gelinkt werden soll (das l ist ein kleines L)
  • Der Aufruf mit der Qt ohne Threadunterstütztung unterscheidet sich nur in diesem letzten Argument: -lqt


Treten beim Kompilieren und Linken keine Fehler auf, kann das Programm nun gestarte werden:
#> ./lektion1