PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt Tutorial: Lektion 2



anda_skoa
08-02-2003, 20:17
Lektion 2

Autor: anda_skoa

Der Button aus Lektion 1 hat noch keine Funktion.
Es wäre doch fein, wenn ein Klick auf den Button das Fenster schliessen
würde.

Das geht ganz leicht, mit nur einem weiteren Befehl:



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

QObject::connect(&helloworld, SIGNAL(clicked()), &app, SLOT(quit()));

helloworld.show();

return app.exec();
}


Betrachten wir die zusätzliche Zeile:



QObject::connect(&helloworld, SIGNAL(clicked()), &app, SLOT(quit()));


Wir sehen im wesentlichen zwei Sachen:
a) den Aufruf der offensichtlich statische Methode connect der Klasse
QObject
b) die Anwendung von zwei Makros: SIGNAL und SLOT

QObject (http://doc.trolltech.com/3.0/qobject.html) ist die Basis
aller Klassen, die in Qt an Events beteilgt sind.

In der Sektion "Static Public Members" finden wir auch die oben benutze
Funktion:


bool connect ( const QObject * sender, const char * signal, const QObject *
receiver, const char * member )


Was macht nun diese Methode?

Sie verbindet ein Signal eines Senderobjektes mit einem Slot eines
Empfängerobjektes.

Signale und Slots sind eine Eigenheit von Qt.
Sie erlauben das verbinden zwei Objekten, ohne dass sich die beiden Partner
kennen müssen.
Nur der Verbinder muss beide kennen.

Signal und Slots sind eine Art lokales Event.

Jede QObject Subklasse kann Signale aussenden und Signale empfangen.
Wenn ein Signal nicht verbunden ist, verpufft es einfach.

Ein Signal kann mit mehreren Slots verbunden sein.
In diesem Fall werden alle Slots in zufälliger Reihenfolge aktiviert, also
ausgeführt.

In unserem Beispiel verknüpfen wir das Signal clicked() des QPushButtons mit
dem Slot quit() der QApplication Instanz.
Signale und Slots befinden sich in der Qt Dokumentation immer in eigene
Sektionen der jeweiligen Klassen.

clicked() ist in dem Fall nicht direkt in QPushButton sondern bereits in der
Basisklasse QButton (http://doc.trolltech.com/3.0/qbutton.html) deklariert.

Wie die leere Klammer andeutet, hat das Signal clicked() keinen
Parameter, transportiert also keine Daten.
Darum können wir es nur mit einem Slot verbinden, der keinen Parameter
erwartet.
Glücklicherweise ist quit() genau so ein Slot. :)

Die Parameter von Signal und Slot müssen immer in ihrem Typ übereinstimmen.
Das wird allerdings erst zur Laufzeit überprüft, der Compiler meldet also
keinen etwaigen Fehler. So etwas sieht man dann auf der Konsole, von der aus
das Programm gestarte wurde.

Dieser Effekt kann leicht demonstiert werden, wenn man clicked()
gegen toggled(bool) austauscht.

Unsere Programmzeile würde in diesem Fall so aussehen:


QObject::connect(&helloworld, SIGNAL(toggled(bool)), &app, SLOT(quit()));


Kompilierung

Die Kompilierung erfolgt wie in der ersten Lektion:



#> g++ -o lektion2 lektion2.cpp -Wall -I/usr/lib/qt-3.0.3/include -L/usr/lib/qt-3.0.3/lib -lqt-mt


Wenn das Programm nun ausgeführt wird, wird bei einem Klick auf den Button
das Programm beendet.
Durch den Klick sendet der Button sein clicked() Signal aus.
Anders als in Lektion 1 ist dieses Signal nun mit quit() der
QApplication verdunden. Darum wird von Qt diese Methode ausgeführt, was die
QApplication dazuveranlasst, sich zu beenden.

Experimente

Die Parameter von Signal und Slot müssen immer in ihrem Typ übereinstimmen.
Das wird allerdings erst zur Laufzeit überprüft, der Compiler meldet also
keinen etwaigen Fehler. So etwas sieht man dann auf der Konsole, von der aus
das Programm gestarte wurde.

Dieser Effekt kann leicht demonstiert werden, wenn man clicked()
gegen toggled(bool) austauscht.

Unsere Programmzeile würde in diesem Fall so aussehen:


QObject::connect(&helloworld, SIGNAL(toggled(bool)), &app, SLOT(quit()));


Bitte wieder abstimmen und kommentieren.

Danke,
_

tuxipuxi
09-02-2003, 13:02
nice!

ufg
09-02-2003, 17:46
Hallo zusammen,

wieder was dazu gelernt - prima.
Schlage vor den Lektionen noch eine passende Überschrift zu geben.
Habt ihr eigentlich vor auf eine bestimmte IDE zuzuarbeiten?
Oder favoritisiert ihr den Editor als Tool zum Erstellen des Quellkodes?
Ich würde das MVC-Konzept
(vgl. http://www.hosengummi.de/beispiel/fuenf_schritte.html)
als Ziel anpeilen. Damit kann man auch größere Anwendungen aus einer kleinen
heraus entwickeln.
Gruß ufg

tuxipuxi
09-02-2003, 18:12
link zu QButton ist deadlink... ich glaube nich das du einen lokalen link wolltest oder?

anda_skoa
09-02-2003, 20:40
Original geschrieben von ufg
wieder was dazu gelernt - prima.


Hört man gerne :)



Schlage vor den Lektionen noch eine passende Überschrift zu geben.


Gute Idee!
Irgendwelche Vorschläge?



Habt ihr eigentlich vor auf eine bestimmte IDE zuzuarbeiten?
Oder favoritisiert ihr den Editor als Tool zum Erstellen des Quellkodes?


Für das Grundlagen Tutorial sollten wir meiner Meinung nach möglichst ohne IDE arbeiten. Wer will kann ja eine benutzen, aber wenn wir eine vorgeben würden, dann würde das den Anwenderkreis einschränken.



Ich würde das MVC-Konzept
(vgl. http://www.hosengummi.de/beispiel/fuenf_schritte.html)
als Ziel anpeilen. Damit kann man auch größere Anwendungen aus einer kleinen
heraus entwickeln.


Das wäre eventuell etwas für ein Fortgeschrittenen Tutorial.
Dieses soll die Grundlagen der Qt basierten Entwicklung enthalten, unabhäng vom Applikationsdesign.

Ciao,
_

anda_skoa
09-02-2003, 20:42
Original geschrieben von tuxipuxi
link zu QButton ist deadlink... ich glaube nich das du einen lokalen link wolltest oder?

Mist, aus dem falschen Browserfenster kopiert :(

Danke für den Hinweis, gefixt.

Ciao,
_

ufg
10-02-2003, 20:21
Hallo,

---8<----------------
> Für das Grundlagen Tutorial sollten wir meiner Meinung nach möglichst ohne IDE
> arbeiten. Wer will kann ja eine benutzen, aber wenn wir eine vorgeben würden,
> dann würde das den Anwenderkreis einschränken.

oder vielleicht Linux-C++-Interessierte von VB, Borland, M$ weglocken...

Gruß ufg

ufg
10-02-2003, 20:24
>> Schlage vor den Lektionen noch eine passende Überschrift zu geben.

> Gute Idee!
> Irgendwelche Vorschläge?

Lektion 1: "Hello World" als Knopf
Lektion 2: Knopf mit Leben füllen

Gruß ufg

Gaert
10-02-2003, 20:37
Hab ich schon erwähnt, dass ich bei dem Wort "Knopf" k**zen muss? :D
Das erinnert mich so an SAP...
Mach aus Knopf Button, dann find ich´s gut.

anda_skoa
10-02-2003, 20:56
Original geschrieben von Gaert
Hab ich schon erwähnt, dass ich bei dem Wort "Knopf" k**zen muss? :D
Das erinnert mich so an SAP...
Mach aus Knopf Button, dann find ich´s gut.

Keine Angst, ich benutze sicher nicht Knopf.

Jedes mal wenn ich das Lese muss ich ein paarmal drüber Lesen und Nachdenken, was denn damit gemeint ist.

Aber er Vorschlag mit "Hello World" ist gut.
Lektion 1: Qt Version von "Hello World"

Lektion 2: Einfaches Eventhandling
oder
Lektion 2: Reagieren auf Buttonklick

Ciao,
_

anda_skoa
10-02-2003, 21:00
Original geschrieben von ufg
Hallo,

---8<----------------
> Für das Grundlagen Tutorial sollten wir meiner Meinung nach möglichst ohne IDE
> arbeiten. Wer will kann ja eine benutzen, aber wenn wir eine vorgeben würden,
> dann würde das den Anwenderkreis einschränken.

oder vielleicht Linux-C++-Interessierte von VB, Borland, M$ weglocken...


Du meinst als Vorteil von IDE als Basis benutzen?

Hmm, ja, da könntest du schon recht haben, aber meiner Meinung nach ist das komplizierter, weil man entweder ein Projekt erstellen muss, oder die IDE ohnehin nur als Editor einsetzt.

Außerdem ist es mit Hilfe von qmake wirklich nicht schwer, Makefiles zu generieren und man lässt den Leuten dann freie Wahl des Editors.

Im Falle eines KDE Tutorials würde ich schon auf KDevelop zurüpckgreifen, weil dann der praktische Teil des generierten Frameworks überwiegt.

Ciao,
_

axeljaeger
11-02-2003, 10:45
>Ein Signal kann mit mehrern Slots verbunden sein.
mit mehreren

Das Tutorial gefällt mir von Schreibstil her sehr gut, nur die Erklärung, was Signals&Slots sind, ist etwas verwirrend

anda_skoa
11-02-2003, 11:09
Original geschrieben von axeljaeger
>Ein Signal kann mit mehrern Slots verbunden sein.
mit mehreren


Thx, gefixt.



Das Tutorial gefällt mir von Schreibstil her sehr gut, nur die Erklärung, was Signals&Slots sind, ist etwas verwirrend

Hmm, ist ein schwierigereres Thema. Irgendwelche alternativen Textpassagen?
Soll ich was rausnehmen, oder ergänzen?

Ciao,
_

axeljaeger
11-02-2003, 12:23
Der Begriff Event ist mehrdeutig: Es gibt in Qt QEvents, die Möglichkeit virtuelles zu überschreiben, um QEvents zu erhalten und Signals&Slots, die einem das Vererben eigentlich ersparen sollen.

ufg
11-02-2003, 13:44
Hallo,
---8<----------------
> > Für das Grundlagen Tutorial sollten wir meiner Meinung nach möglichst ohne IDE
> > arbeiten. Wer will kann ja eine benutzen, aber wenn wir eine vorgeben würden,
> > dann würde das den Anwenderkreis einschränken.

> oder vielleicht Linux-C++-Interessierte von VB, Borland, M$ weglocken...
> Original geschrieben von anda_skoa
> Du meinst als Vorteil von IDE als Basis benutzen?
Ich meine den Motivationsschub nutzen den die IDE bringt!

> Hmm, ja, da könntest du schon recht haben, aber meiner Meinung nach ist das
> komplizierter, weil man entweder ein Projekt erstellen muss,
na und...
> oder die IDE ohnehin nur als Editor einsetzt.
na und...
Aber ich denke mehr an Programmieranfänger und die sind Klick-verseucht.
Die Konsole ist für die das was die Schlange für das Kaninchen ist.
Also was zum Abgewöhnen.

Es gibt noch einen Grund die Erstellung mit einem Editor abzulehnen.
Es würde mich aber deine Meinung dazu wirklich interessieren:
Die beiden Lektionen zeigen sehr gut wie man mit Qt programmieren kann.
Aber es ist ein Programmierstil mit dem man keine größeren Programme erstellen kann.
Schreibt man mit dem Editor größere Programme muß man das Programm auf
mehrere Dateien aufteilen. Und das wird dann kompliziert. Da ist dann eine IDE
zweckmäßiger.
Aber wie gesagt: Es würde mich deine Meinung dazu wirklich interessieren da
ich qmake nicht kenne.
Gruß ufg

> Außerdem ist es mit Hilfe von qmake wirklich nicht schwer, Makefiles zu
> generieren und man lässt den Leuten dann freie Wahl des Editors.
qmake kenne ich nicht; benutze halt KDevelop (-:

> Im Falle eines KDE Tutorials würde ich schon auf KDevelop zurüpckgreifen, weil
> dann der praktische Teil des generierten Frameworks überwiegt.

anda_skoa
11-02-2003, 14:50
Original geschrieben von ufg
Ich meine den Motivationsschub nutzen den die IDE bringt!


Ok, das kann ich nachvollziehen.
Allerdings sind automake/autoconf basierte IDEs wie KDevelop für WindowsIDE User meist ein bischen kompliziert :)



> Hmm, ja, da könntest du schon recht haben, aber meiner Meinung nach ist das
> komplizierter, weil man entweder ein Projekt erstellen muss,
na und...


:)
Ich hab schon paarmal gelesen "wie mach ich in KDevelop eine neue Datei"



> oder die IDE ohnehin nur als Editor einsetzt.
na und...
Aber ich denke mehr an Programmieranfänger und die sind Klick-verseucht.
Die Konsole ist für die das was die Schlange für das Kaninchen ist.
Also was zum Abgewöhnen.

Ich versteh schon deine Sichtweise und es gibt dagegen auch nichts zu sagen.

Aber eine IDE ist eben ziemlich speziell. Da wird es schwierig, es so zu schreiben, dass man es leicht auch ohne machen kann, oder mit einer anderen IDE.

Und auf viele traditionellen Unix/Linux Programmierer wirken IDE zum Abgewöhnen :)



Es gibt noch einen Grund die Erstellung mit einem Editor abzulehnen.
Es würde mich aber deine Meinung dazu wirklich interessieren:
Die beiden Lektionen zeigen sehr gut wie man mit Qt programmieren kann.
Aber es ist ein Programmierstil mit dem man keine größeren Programme erstellen kann.


Das ist auch ein Qt Grundlagen Tutorial.
Wenn ich eine Tutorial über die Verwendung von Custom KParts in Applikationen schreibe, sieht das anders aus :D



Schreibt man mit dem Editor größere Programme muß man das Programm auf
mehrere Dateien aufteilen. Und das wird dann kompliziert. Da ist dann eine IDE
zweckmäßiger.
Aber wie gesagt: Es würde mich deine Meinung dazu wirklich interessieren da
ich qmake nicht kenne.


Nicht so ungeduldig :rolleyes:
Ich brauch ein bischen Zeit um die Lektionen zu schreiben.

Genau die von dir angesprochenen Sachen kommen in Lektion 3 und 4.
Heute oder morgen :cool:

Ciao,
_

Gaert
11-02-2003, 14:54
Ich finde, dass man sich nicht zu früh auf eine IDE einlassen sollte, da man auch von einem Funktionsumfang einer IDE abgeschreckt werden kann.
Wenn man etwas neues lernen will, dann muss man nicht gleich mit einer
überdimensionierten IDE anfangen (du machst ja auch nicht im Ferrari Fahrschule oder?).
Dass eine gute IDE für große Projekte unabdingbar ist, ist jedem klar, aber für ein paar Zeilen Code aus einem Tutorial bemühe ich doch lieber irgendeinen bescheidenen Editor.

tuxipuxi
11-02-2003, 15:56
ACK ... kdevelop schreckt ab und ich weiss nicht ab welcher groesse man das brauchen soll... uebertrieben komplex.

anda_skoa
12-02-2003, 17:00
Original geschrieben von axeljaeger
Der Begriff Event ist mehrdeutig: Es gibt in Qt QEvents, die Möglichkeit virtuelles zu überschreiben, um QEvents zu erhalten und Signals&Slots, die einem das Vererben eigentlich ersparen sollen.

Hmm, du hast Recht.

Ich hab den Begriff Event verwendet um anzudeuten, dass es eine ähnliche Sache ist.

Ein Signal ist ein Ereignis, dass amn behandeln kann, ohne das der Erzeuger des "Events" wissen muss, wer oder wieviele "Handler" es gibt.

Vielleicht fällt mir was ein, wie man das anders formulieren kann.

Vorschläge willkommen :)

Ciao,
_

anda_skoa
12-02-2003, 21:03
Ich habs mal übernommen.

Wenn noch Änderungen anfallen, können wir das dann schon om "echten" Tutorial Thread machen.

Ciao,
_