Anzeige:

Umfrageergebnis anzeigen: Qt Tutorial: Lektion 3

Teilnehmer
4. Du darfst bei dieser Umfrage nicht abstimmen
  • ja, passt

    4 100,00%
  • nein, passt nicht

    0 0%
  • ich hab eine bessere Lektion 3

    0 0%
Ergebnis 1 bis 3 von 3

Thema: Lektion 3: Benutzung eines eigenen Widgets

  1. #1
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Lektion 3: Benutzung eines eigenen Widgets

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

    Code:
    #include "qttutwidget.h"
    Hier inkludieren wir den Header unseres neuen Widgets.

    Code:
        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:
    Code:
    #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.

    Code:
    #include <qlabel.h>
    Der Header für QLabel wird inkludiert.
    Das tun wir, weil das die Basisklasse unsere Widgets sein wird.

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

    Code:
        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.

    Code:
    #include "qttutwidget.h"
    In der cpp Datei inkludieren wir natürlich den zugehörigen Header.

    Code:
    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.
    Qt/KDE Entwickler
    Debian Benutzer

  2. #2
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    das ist ja wohl richtig scheisse..



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

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hab die Lektion ins Tutorial übernommen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •