Thursday, 24. November 2005, 18:25:17
Weiter geht's mit dem Tutorial. Wie versprochen wird es ganz einfach. Ein kleines "Hello World" Programm.
Als Erstes erstellen wir ein neues Projekt in Eclipse. Ein "Standard Make C++ Project" damit uns Eclipse nicht mit dem Erzeugen von eigenen Makefiles in die Quere kommt. Wir haben ja mit Qt alles was wir brauchen ... vorerst. Verpasst eurem Projektnamen einen Namen. Ich habe es "helloQt" genannt ... und auf Finish gedrückt.
Jetzt haben wir ein jungfreuliches Projekt vor uns liegen. Was wir jetzt brauchen sind die Qt Include Dateien, damit wir die ganzen netten Sachen in Eclipse nutzen können; Codevervollständigung z. B.. Also, Rechtsklick auf das neuerstellte Projekt und im Kontextmenü die
Properties auswählen. Hier geht auf den Menüpunkt
C/C++ Include Paths & Symbols und klickt auf den Knopf
Add External Include Path ... und hier auf den
Browse ... Knopf. Navigiert nun zum Verzeichnis
$QTDIR/include/Qt und bestätigt zwei Mal mit ok.
projekt_properties.pngSo* müsste bei Euch das Fenster aussehen nach dem zweimaligen Bestätigen. Jetzt wird die Autovervollständigung auch die Methoden anzeigen, die in den Qt Klassen enthalten sind. Hört sich logisch an :) ... es war nicht immer so in CDT.
Jetzt kommen wir zum Eigentlichen. Wir programmieren *Tim Taylor grunzen hier einfügen*.
Was wir brauchen ist eine *.cpp Datei. Erstellen wir doch einfach eine. Strg+N drücken, C++ Verzeichnis runterklappen und
Source File auswählen. Benennt die Datei, "main.cpp" zum Beispiel.
Jetzt fügen wir entweder alle Dateien die für das Erstellen einer GUI Anwendung nötig ist, oder nur die Dateien, die wir wirklich benötigen.
Variante 1#include <QtGui>
Variante 2
#include <QApplication>
#include <QLabel>
Bei der Variante 1 werden eine Menge Dateien mit eingefügt, die unter Umständen überhaupt nicht benötigt werden. Ihr könnt den Inhalt der Datei QtGui einsehen indem ihr einfach in das Outline Panel in Eclipse geht und dort auf QtGui doppelklickt.
Also die Variante 2.
Jetzt kommen wir zum Wesentlichen.
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv) {
QApplication app(argc, argv);
QLabel lbl("Hallo Qt Welt!");
lbl.setWindowTitle("halloQt");
lbl.setGeometry(500, 300, 300, 300);
lbl.show();
return app.exec();
}
Die ersten zwei Zeilen sind die Includes, die ich schon beschrieben habe. Die main Funktion sollte auch bekannt sein. Hier erzeugen wir als erstes eine QApplication Instanz auf dem Stack. Das hat den Vorteil, dass die automatisch beim Beenden der main Funktion zerstört wird.
Im nächsten Schritt erzeugen wir eine QLabel Instanz ... ebenso auf dem Stack. Dem Konstruktor übergeben wir einen String "Hallo Qt Welt!", der dann später auch im Fenster angezeigt wird. Die Funktion
setWindowTitle setzt den Fenstertitel. Dieser wird im Fensterrahmen und in der Taskbar angezeigt.
setGeometry(x, y, w, h) definiert die Position sowie die Breite und die Höhe des Fensters. Mit
show() lassen wir schliesslich das Fenster erscheinen. Das Fenster enthält nur unser Label mit dem Text "Hallo Qt Welt!".
Die letzte Zeile ruft die Funktion
exec() auf. Die exec() Funktion in qapplication.cpp sieht folgendermaßen aus:
int QApplication::exec()
{
#ifndef QT_NO_ACCESSIBILITY
QAccessible::setRootObject(qApp);
#endif
return QCoreApplication::exec();
}
Im Wesentlichen wird die exec() Funktion der QCoreApplication ausgeführt. Hier ist sie:
int QCoreApplication::exec()
{
if (!QCoreApplicationPrivate::checkInstance("exec"))
return -1;
QThread *currentThread = QThread::currentThread();
if (currentThread != self->thread()) {
qWarning("QApplication::exec() failed: must be called from the main thread.");
return -1;
}
QThreadData *data = QThreadData::get(currentThread);
if (!data->eventLoops.isEmpty()) {
qWarning("QApplication::exec() failed: the event loop is already running.");
return -1;
}
QEventLoop eventLoop;
int returnCode = eventLoop.exec();
if (self) {
emit self->aboutToQuit();
sendPostedEvents(0, QEvent::DeferredDelete);
}
return returnCode;
}
In dieser Funktion pumpt quasi das Herz einer Jeden Anwendung. Die Ereignisschleife "eventLoop". In dieser Schleife werden Nachrichten zwischen der Anwendung dem System und dem Benutzer verschickt. Darauf werde ich jedoch nicht tiefer eingehen.
Das ist wirklich beeindruckend wenig Code den wir zu schreiben hatten, nicht wahr. Im nächsten Schritt muß die [verzeichnisname*].pro Datei erstellt werden. Das erledigt für uns das Externe Tool
qmake project, das wir im
Teil 1 erstellt haben. Einfach das Tool aufrufen und schon wird eine helloQt.pro Datei in unserem Verzeichnis angelegt.
Der Inhalt der Datei helloQt.pro sollte ungefähr -- eigentlich genau so -- aussehen:
######################################################################
# Automatically generated by qmake (2.00a) Do Nov 24 19:05:18 2005
######################################################################
TEMPLATE = app
TARGET +=
DEPENDPATH += .
INCLUDEPATH += .
# Input
SOURCES += main.cpp
Was in dieser Datei stehen muss und was das alles bedeutet wird in der
qmake Dokumentation genauestens beschrieben.
Jetzt muß die Makefile Datei erzeugt werden. Das nächste nützliche Externe Tool ... qmake. Einfach das Werkzeug aufrufen und schon erscheint eine Makefile Datei mit allem was nötig ist.
Das weitere Vorgehen ist das Folgende. Wir sollten unsere Anwendung aus Eclipse heraus ausführen können. Dazu gehen wir in das Menü mit dem grünen Pfeil und wählen dort den Menüpunkt
Run ... aus.
Im folgenden Dialog erzeugen wir unter
C/C++ Local Application einen neuen Eintrag mit dem Betätigen des
New Knopfes.
neues_projekt.pngProject:
helloQt
C/C++ Application:
helloQt
Passt die Daten im rechten Dialogfenster entsprechend an; Wenn ihr meine Benennung übernommen habt sollten die Einträge meinen entsprechen. Unter Umständen müsst ihr noch den Debugger auswählen. Geht dazu einfach auf den Registerreiter "Debugger" und wählt dort einen Debugger aus. Damit ihr Eure Anwendung später direkt aus dem Run Menü auswählen könnt müsst ihr noch im Register "Common" unter den "Display in favorites menu" am besten beide Checkboxen anwählen; für das Run und das Debug Menü. Bestätigt alle Eingaben mit dem
Apply Knopf.
Jetzt müsste alles funktionieren. Wählt im Run Menü helloQt aus und das Projekt wird kompilliert und gestartet. Das Resultat sollte aussehen wie im Folgenden Bild:

Ziel erreicht. Glückwunsch. Bis zum nächsten Mal.
* Da ich mittlerweile Qt als rpm installiert habe hat sich der Pfad der Includedateien entsprächend geändert. Dem alten Beispiel folgend wäre der Pfad natürlich "/usr/local/Trolltech/Qt-4.0.0/include/Qt"* Der Verzeichnisname entspricht bei einem Eclipseprojekt dem Projektnamen.