PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lektion 3: Benutzung eines eigenen Widgets



anda_skoa
11-02-2003, 16:07
Lektion 3: Benutzung eines eigenen Widgets

In dieser Lektion haben wir es nun mit drei Dateien zu tun:
lektion3.cpp: enthält wie immer die main Funktion
qttutwidget.h: enthält die Deklaration einer Beispielwidgetklasse
qttutwidget.cpp: enthält die Implementation des Widgets

lektion3.cpp


#include <qapplication.h>
#include <qpushbutton.h>

#include "qttutwidget.h"

int main( int argc, char* argv[] )
{
QApplication app( argc, argv );

QtTutWidget helloworld( "Hello World", 0 );
helloworld.resize( 100,30 );

app.setMainWidget( &helloworld );

helloworld.show();

return app.exec();

}


qttutwidget.h


#ifndef QTTUTWIDGET_H
#define QTTUTWIDGET_H

#include <qlabel.h>

class QtTutWidget : public QLabel
{
public:
QtTutWidget(QString text, QWidget* parent=0, const char* name=0);
};

#endif


qttutwidget.cpp


#include "qttutwidget.h"

QtTutWidget::QtTutWidget(QString text, QWidget* parent, const char* name)
: QLabel(text, parent, name)
{
}


Erklärungen der Änderungen

Unser Hauptprogramm sieht fast wie das aus Lektion 1 aus.
Es gibt hier nur zwei Unterschiede:



#include "qttutwidget.h"

Hier inkludieren wir den Header unseres neuen Widgets.



QtTutWidget helloworld( "Hello World", 0 );


Und hier erzeugen wir es. Der Typ von helloworld ist nun nicht mehr QPushButton sondern unser
neues Widget.

Sehen wir uns die beiden neuen Dateien an:


#ifndef QTTUTWIDGET_H
#define QTTUTWIDGET_H

#endif


Hier sehen wir eine spezielle Konstruktion aus Preprozessor Direktiven.
Wir bräuchten sie hier nicht, aber im Normallfall gehört so etwas in ein Headerfile, um es vor
Mehrfachinkludierung zu schützen.

Wie funktioniert das?
Die erste Zeile prüft, ob ein gewisses Symbol (QTTUTWIDGET_H) definiert ist.
ifndef (if not defined) wird war, wenn das Symbol nicht definiert ist.

Alle Zeilen bis zum endif werden darum vom Preprozessor ausgeblendet, wenn das QTTUTWIDGET_H
definert ist.
Genau das passiert in der zweiten Zeile.

Wird der Header zum erstenmal inkludiert, ist das Symbol nicht bekannt, der Header wird also vollständig
übernommen, aber gleichzeitig wird durch das define das Symbol bekannt gemacht.
Wird der Header nun ein weiteres Mal inkludiert, kennt der Preprozessor das Symbol und übergeht
den Header.



#include <qlabel.h>

Der Header für QLabel (http://doc.trolltech.com/3.0/qlabel.html) wird inkludiert.
Das tun wir, weil das die Basisklasse unsere Widgets sein wird.



class QtTutWidget : public QLabel

Unser Widget mit dem Klassennamen QtTutWidget wird deklariert und wir geben an, dass es von QLabel
abgeleitet ist.



QtTutWidget(QString text, QWidget* parent=0, const char* name=0);

Der Konstruktor unseres Widgets wird deklariert. So einen ähnlichen gibt es auch von QLabel.
Der erste Parameter ist der darzustellende Text, der zweite das Parentwidget (siehe Lektion 1)
und der dritte ist der Name des Objekts (alle QObject Instanzen können einen Namen haben).

Den zweiten und dritten Parameter haben wir mit einem Standardwert (=0) ausgestattet, das erlaubt uns
diese Parameter nicht unbedingt angeben zu müssen.



#include "qttutwidget.h"

In der cpp Datei inkludieren wir natürlich den zugehörigen Header.



QtTutWidget::QtTutWidget(QString text, QWidget* parent, const char* name)
: QLabel(text, parent, name)
{
}

Die Implementation unseres Konstruktors.
Sie hat einen leeren Funktionskörper, weil wir nichts spezielles tun möchte.
Die Parameter werden ungeändert an den Konstruktor der Basisklasse weitergegeben.

Erstellung

Die Kommandos zur Programmerstellung werden nun in zwei Bereiche getrennt, die eigentliche Kompilierung
und das Linken.
Das Kompilieren erzeugt aus dem Quellcode einen binären Maschinencode, das Linken verbindet solche Dateien
dann zu einem Programm.



#> g++ -c -o lektion3.o lektion3.cpp -Wall -I/usr/lib/qt-3.0.3/include

Kompiliert lektion3.cpp in ein Objectfile. Da wir in diesem Schritt nicht linken, brauchen wir
keine Linkeranweisungen.
Das -c sagt dem Compiler, dass wir nur kompilieren wollen.



#> g++ -c -o qttutwidget.o qttutwidget.cpp -Wall -I/usr/lib/qt-3.0.3/include

Kompiliert die Widgetklasse.

Jetzt noch linken:


#> g++ -o lektion3 lektion3.o qttutwidget.o -Wall -L/usr/lib/qt-3.0.3/lib -lqt-mt


Die Eingangsdateien des Linkerschritts sind nun die Resultate der Kompilierschritte.
Hier braucht man wieder die Linkeranwesiungen, kann aber diesmal die -I Angabe weglassen.

tuxipuxi
11-02-2003, 16:15
das ist ja wohl richtig scheisse..



neee natuerlich spass :) wollte nur mal was anderes sagen :).
ne, natuerlich super.

anda_skoa
18-02-2003, 22:06
Hab die Lektion ins Tutorial übernommen.

Ciao,
_