PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt Tutorial: Lektion1



anda_skoa
06-02-2003, 18:53
Dies ist mal der Entwurf für Lektion1 unseres Qt Tutorials.
Basis bildet der Vorschlag von tuxipuxi.

Lektion1

Autoren: tuxipuxi, anda_skoa

Beipieldatei: lektion1.cpp



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



#include <qapplication.h>


Dieser Header deklariert die Klasse QApplication (http://doc.trolltech.com/3.0/qapplication.html).
Eine Instanz der Klasse QApplication wird benötigt, wenn das Programm das Eventhandling von
Qt benutzen möchte.
Events benötigt man wenn man
a) Widgets benutzt, d.h. wenn man eine GUI machen möchte
b) Sockets benutzt, d.h. wenn man Netzwerkkommunikation machen möchte
c) QProcess benutzt, d.h. wenn man andere Programme als Kindprozesse starten möchte

In diesem Fall trifft (a) zu.



#include <qpushbutton.h>


Dieser Header deklariert die Klasse QPushButton (http://doc.trolltech.com/3.0/qpushbutton.html).
Ein QPushButton ist ein klassischer Button.



int main( int argc, char *argv[] )


Beginn der normalen main Funktion eines C++ Programms.



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.



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.



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.



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.



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.



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
-L/usr/lib/qt-3.0.3/lib : Angabe eines Pfaed für Bibliotheken
-lqt-mt : die Bibliothek, mit der unser Programm gelinkt werden soll
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


Bitte voten und kommentieren.

Ciao,
_

tuxipuxi
06-02-2003, 19:02
ja ist besser als meine basis... nur die erklaerung mit ebents ist fuer lektion1 nicht angemessen.

ufg
06-02-2003, 19:42
Hallo zusammen,

hier hat sich ein Fehlerteufelchen eingeschlichen:

Hier übergeben wir der Qt-Application ( app ) das Kommando.
Sobald diese beendet wird, liefert app einen Rpckgabewert <--da

Gruß ufg

anda_skoa
06-02-2003, 20:08
Original geschrieben von ufg
Hallo zusammen,

hier hat sich ein Fehlerteufelchen eingeschlichen:

Hier übergeben wir der Qt-Application ( app ) das Kommando.
Sobald diese beendet wird, liefert app einen Rpckgabewert <--da


Danke, hab ich behoben.

Ciao,
_

anda_skoa
06-02-2003, 20:10
Original geschrieben von tuxipuxi
ja ist besser als meine basis... nur die erklaerung mit ebents ist fuer lektion1 nicht angemessen.

Hmm, irgend eine bestimmte Passage?

Ich kann einfach ned so abschätzen, was jemand brauchen könnte, wenn man grundlegendes C++ Wissen als gegeben nimmt.

War ich zu speziell?

Ciao,
_

msi
06-02-2003, 21:03
hey,
das ist super, wenn ihr weiterschreibt, dann bitte hier im Forum (am Besten News) einen Thread öffnen mit einem Link darauf!

Markus

xare
06-02-2003, 21:29
Allererste Sahne würde ich sagen. Ich bin übrigens genau auf dem Kenntnisstand, wo man sowas brauchen kann und freue mich, dass sich jemand die Mühe macht und so ein Tutorial schreibt.

Ein bisschen c++-Wissen ist da, aber nur Grundlagen. Mehr kann man bei einem qt-Anfänger, der dieses Tut liest, glaub ich, auch nicht erwarten, sonst würde er sich einfach die APIs nehmen und loslegen. Deswegen finde ich es auch passend, dass das Kompilieren genau beschrieben wurde. Und dass nicht gleich mit ner IDE angefangen wurde.

Was soll denn in der nächsten Lektion drankommen? Was mich bei den vorhandenen Tutorials sehr stört, ist, dass nirgends beschrieben ist, wie ein Makefile funktioniert. Anscheinend wird hier angenommen, dass man es entweder eh von ner IDE generiert bekommt oder gar nicht benutzt. :( Ich bin aber der Meinung, dass man das auch mal lernen sollte, egal ob IDE oder nicht. Vielleicht könnt ihr diese Lücke ja stopfen. :)

Ein Dankeschön und viele Grüße,
Xare

anda_skoa
06-02-2003, 22:49
Original geschrieben von msi
hey,
das ist super, wenn ihr weiterschreibt, dann bitte hier im Forum (am Besten News) einen Thread öffnen mit einem Link darauf!


Sobald die erste Lektion fertig ist, also die Leute ihre Verbesserungen hier kund getan haben, werd ich ein FAQ Item oder sowas machen (muss mich da mit netzmeister unterhalten).
Dort kommen dann die fertigen Lektionen rein.

Wie gesagt, sobald die erste Lektion fertig ist, mach ich auch eine Ankündigung in News.

Ciao,
_

anda_skoa
06-02-2003, 22:55
Original geschrieben von xare
Allererste Sahne würde ich sagen. Ich bin übrigens genau auf dem Kenntnisstand, wo man sowas brauchen kann und freue mich, dass sich jemand die Mühe macht und so ein Tutorial schreibt.


:)
Dann kannst du dich als offiziellen Test Developer betrachten :D
Diese Lektion ist gerade in der Begutachtungsphase, also ist jede Art von Kritik jetzt am angebrachtesten.



Und dass nicht gleich mit ner IDE angefangen wurde.


Das ist für mich einer der Hauptpunkte.
Man kann dann immer noch ein $IDE Tutorial machen.



Was soll denn in der nächsten Lektion drankommen?


Ich hab keinen genauen Zeitplan dafür. Mein Vorschlag für die nächste Lektion beinhaltet keine großen Änderungen, vielleicht mach ich das gleich morgen.
Ich möchte aber allen Interessierten genug Zeit geben, sich diesen Entwurf anzusehen und eventuelle Verbesserungen/Kritiken einfliessen zu lassen.



Was mich bei den vorhandenen Tutorials sehr stört, ist, dass nirgends beschrieben ist, wie ein Makefile funktioniert. Anscheinend wird hier angenommen, dass man es entweder eh von ner IDE generiert bekommt oder gar nicht benutzt. :( Ich bin aber der Meinung, dass man das auch mal lernen sollte, egal ob IDE oder nicht. Vielleicht könnt ihr diese Lücke ja stopfen. :)


Schau mal hier http://www.mrunix.de/forums/showthread.php?s=&threadid=31127

Vorschlag für Lektion4 beinhaltet generieren eines passenden Makefile mit Hilfe von qmake.

Ciao,
_

axeljaeger
07-02-2003, 22:23
>>> Das erste Argument gibt den Text a,n der im QPushButton stehen soll, der zweite das Parent Widget. <<<<

da ist ein Komma zwischen dem "a" und dem "n" zu viel

anda_skoa
08-02-2003, 00:55
Original geschrieben von axeljaeger
>>> Das erste Argument gibt den Text a,n der im QPushButton stehen soll, der zweite das Parent Widget. <<<<

da ist ein Komma zwischen dem "a" und dem "n" zu viel

Thx, gefixt.

Ciao,
_

anda_skoa
08-02-2003, 20:15
Nachdem das Echo durchwegs positiv war, hab ich das Tutorial mit der ersten Lektion angelegt.

Ciao,
_