Getting Started/de: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
diese Seite in: [http://doc.qt.nokia.com/4.7/gettingstartedqt.html en] ''[doc.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedQt_Spanish es] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedWithQtRussian ru] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedQtPolish pl] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/gettingStartedPortuguese pt] ''[developer.qt.nokia.com]'', [http://developer.qt.nokia.com/wiki/GettingStartedQtDutch nl] ''[developer.qt.nokia.com]''
diese Seite in: "en":http://doc.qt.nokia.com/4.7/gettingstartedqt.html, "es":http://developer.qt.nokia.com/wiki/GettingStartedQt_Spanish, "ru":http://developer.qt.nokia.com/wiki/GettingStartedWithQtRussian, "pl":http://developer.qt.nokia.com/wiki/GettingStartedQtPolish, "pt":http://developer.qt.nokia.com/wiki/gettingStartedPortuguese, "nl":http://developer.qt.nokia.com/wiki/GettingStartedQtDutch


=Schnelleinstieg in die Programmierung mit Qt=
[toc align_right="yes" depth="2"]


Willkommen in der Welt von Qt des Plattformübergreifenden <span class="caps">GUI</span> Framework. In dieser “Schnelleinstiegs”-anleitung lehren wir grundlegendes Qt Wissen durch das Implementieren einer einfachen Notepad Anwendung. Nach dem Durchlesen dieser Anleitung sind Sie soweit in die Übersichten und <span class="caps">API</span> Dokumentation einzutauchen und die Informationen zu finden, die Sie für die Anwendung brauchen, die Sie entwickeln.
= Schnelleinstieg in die Programmierung mit Qt =


==Hallo Notepad==
Willkommen in der Welt von Qt des Plattformübergreifenden GUI Framework. In dieser &quot;Schnelleinstiegs&amp;quot;-anleitung lehren wir grundlegendes Qt Wissen durch das Implementieren einer einfachen Notepad Anwendung. Nach dem Durchlesen dieser Anleitung sind Sie soweit in die Übersichten und API Dokumentation einzutauchen und die Informationen zu finden, die Sie für die Anwendung brauchen, die Sie entwickeln.
 
== Hallo Notepad ==


In diesem ersten Beispiel werden wir ein einfaches Texteingabefeld erstellen und in einem Fenster auf dem Desktop anzeigen. Das stellt das einfachste Qt Programm mit einer Benutzeroberfläche dar.
In diesem ersten Beispiel werden wir ein einfaches Texteingabefeld erstellen und in einem Fenster auf dem Desktop anzeigen. Das stellt das einfachste Qt Programm mit einer Benutzeroberfläche dar.


[[Image:gs1.png|Texteingabefenster]]
p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|Texteingabefenster]]


Hier ist der Code:<br /> Lassen Sie uns mal Zeile für Zeile durch den Code gehen. In den ersten beiden Zeilen binden wir die Headerdateien für [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' und [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'' ein, die beide Klassen darstellen, die wir für dieses Beispiel benötigen. Alle Qt Klassen haben eine Headerdatei, die den Namen der Klasse trägt.
Hier ist der Code:<br /><code><br />#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;


Zeile 6 erstellt ein QApplication Objekt. Dieses Objekt behandelt anwendungsweit Ressourcen und ist notwendig für eine Qt Anwendung mit einer grafischen Benutzeroberfläche. Der Konstruktor benötigt argv und args, weil Qt ein Paar Kommandozeilenargumente entgegen nehmen kann.
int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);


Zeile 8 erstellt ein QTextEdit Objekt. Eine Texteingabefeld ist ein visuelles Element einer Benutzeroberfläche. In Qt nennen wir solche Elemente Widgets. Beispiele anderer Widgets sind Scrollbalken, Labels und Radiobuttons. Ein Widget kann auch ein Container für andere Widgets sein; ein Dialog oder ein Hauptanwendungsfenster zum Beispiel.
QTextEdit textEdit;<br /> textEdit.show();


Zeile 9 zeigt das Texteingabefeld auf dem Bildschirm in seinem eigenen Fenster. Da Widgets auch als Container verwendet werden können (z. B. ein [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'', das Toolbars, Menüs, Statuszeile und ein Paar andere Widgets), ist es möglich ein einzelnes Widget in eigenem Fenster anzuzeigen. Widgets sind standardmäßig nicht sichtbar; die Funktion [http://doc.qt.nokia.com/4.7/qwidget.html#show show()] ''[doc.qt.nokia.com]'' macht sie sichtbar.
return app.exec&amp;amp;#40;&amp;#41;;<br />}<br /></code><br />Lassen Sie uns mal Zeile für Zeile durch den Code gehen. In den ersten beiden Zeilen binden wir die Headerdateien für &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html und &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html ein, die beide Klassen darstellen, die wir für dieses Beispiel benötigen. Alle Qt Klassen haben eine Headerdatei, die den Namen der Klasse trägt.


Zeile 11 läßt [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' in die Ereignisschleife eintreten. Solange eine Qt Anwendung läuft werden Ereignisse generiert und an die Widgets der Anwendung gesendet. Beispiele solcher Ereignisse sind Mausklicks oder Tastatureingaben. Wenn Sie einen Text in das Texteingabefeld eintippen empfängt es Tastatureingabe Ereignisse und beantwortet diese in dem es den eingegebenen Text darstellt.
Zeile 6 erstellt ein QApplication Objekt. Dieses Objekt behandelt anwendungsweit Ressourcen und ist notwendig für eine Qt Anwendung mit einer grafischen Benutzeroberfläche. Der Konstruktor benötigt argv und args, weil Qt ein Paar Kommandozeilenargumente entgegen nehmen kann.


Um die Anwendung auszuführen öffnen Sie die Kommandozeile und gehen zum Verzeichnis in dem Sie die .cpp Dateien des Programms liegen haben. Folgende Shell Kommandos übersetzen und erstellen das Programm.<br /> Das wird eine ausführbare Datei im part1 Verzeichnis erstellen (unter Windows werden Sie u. U. nmake anstatt make verwenden müssen. Ferner wird die ausführbare Datei in part1/debug oder part1/release erstellt). qmake is Qts Erstellprogramm, das eine Konfigurationsdatei entgegen nimmt. qmake erstellt diese für uns, wenn das Argument -project übergeben wird. Mit der Konfigurationsdatei (mit der Endung .pro) erstellt qmake eine make Datei, das das Programm für Sie erstellt. Wir werden uns später ansehen wie man eigene .pro Datei schreibt.
Zeile 8 erstellt ein QTextEdit Objekt. Eine Texteingabefeld ist ein visuelles Element einer Benutzeroberfläche. In Qt nennen wir solche Elemente Widgets. Beispiele anderer Widgets sind Scrollbalken, Labels und Radiobuttons. Ein Widget kann auch ein Container für andere Widgets sein; ein Dialog oder ein Hauptanwendungsfenster zum Beispiel.
 
===Mehr erfahren {| class="infotable line" ! Über ! Hier |- | Widgets und Fenstergeometrie | [http://doc.qt.nokia.com/4.7/application-windows.html Window and Dialog Widgets] ''[doc.qt.nokia.com]'' |- | Ereignisse und ihre Behandlung | [http://doc.qt.nokia.com/4.7/eventsandfilters.html The Event System] ''[doc.qt.nokia.com]'' |}===
 
==Einen Beenden Knopf hinzufügen==
 
In einer echten Anwendung werden Sie mehr als nur ein Widget benötigen. Wir werden nun einen [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' unter das Texteingabefeld anbringen. Der Knopf wird die Notepad Anwendung beim Betätigen (z. B. durch das Klicken mit der Maus) beenden.
 
[[Image:gs2.png|Eingabefeld mit Beenden Knopf]]
 
Lassen Sie uns mal einen Blick auf den Code werfen:<br /> Zeile 1 fügt [http://doc.qt.nokia.com/4.7/qtgui.html QtGui] ''[doc.qt.nokia.com]'' ein, das alle Qts <span class="caps">GUI</span> Klassen enthält.
 
Zeile 10 verwendet Qts Signals and Slots Mechanismus um die Anwendung beim Drücken des '''Beenden Knopf''' zu schließen. Ein Slot ist eine Funktion, die durch die Verwendung ihres Namens (in Form einer Zeichenkette) zu Laufzeit aufgerufen werden kann. Ein Signal ist eine Funktion die, wenn aufgerufen, alle dazu registrierten Slots aufruft; wir nennen es einen Slot mit einem Signal verbinden und ein Signal erzeugen.
 
[http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit quit()] ''[doc.qt.nokia.com]'' ist ein Slot der [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'', der die Anwendung beendet. [http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked clicked()] ''[doc.qt.nokia.com]'' ist ein Signal, das [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' erzeugt, wenn der Knopf gedrückt wird. Die statische [http://doc.qt.nokia.com/4.7/qobject.html#connect QObject::connect()] ''[doc.qt.nokia.com]'' Funktion sorgt für die Verbindung des Slots und des Signals. <span class="caps">SIGNAL</span> und <span class="caps">SLOT</span> sind zwei Makros, die die Funktionssignatur des Signal bzw. Slot entgegennehmen, die verbunden werden sollen. Ferner müssen wir die Zeiger der Objekte übergeben, das das Signal sendet bzw. empfängt.
 
Zeile 12 erzeugt ein [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]''. Wie bereits erwähnt können Widgets auch andere Widgets enthalten. Es ist möglich die Abgrenzungen (Größe und Position) eines Kindwidgets direkt zu setzen. Jedoch ist es einfacher ein Layout zu verwenden. Ein Layout verwaltet die Abgrenzungen der Kindwidgets. Beispielsweise positioniert [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]'' die Kindelemente vertikal untereinander.
 
Zeile 13 und 14 fügen das Texteingabefeld und den Knopf dem Layout hinzu. In Zeile 17 setzen wir das Layout eines Widgets.
 
===Mehr erfahren {| class="infotable line" ! Über ! Hier |- | Signale und Slots | [http://doc.qt.nokia.com/4.7/signalsandslots.html Signals &amp; Slots] ''[doc.qt.nokia.com]'' |- | Layouts | [http://doc.qt.nokia.com/4.7/layout.html Layout Management] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/widgets-and-layouts.html Widgets and Layouts] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-layouts.html Layout Examples] ''[doc.qt.nokia.com]'' |- | Widgets die Qt bereitstellt | [http://doc.qt.nokia.com/4.7/gallery.html Qt Widget Gallery] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-widgets.html Widget Examples] ''[doc.qt.nokia.com]'' |}===
 
==QWidget Unterklassen erstellen==


Wenn der Benutzer die Anwendung beenden will ist es u. U. erwünscht einen Dialog anzuzeigen, der sicherstellt, daß der Benutzer die Anwendung tatsächlich beenden möchte. In diesem Beispiel erstellen wir eine [http://doc.qt.nokia.com/4.7/qwidget.html QWidget] ''[doc.qt.nokia.com]'' Unterklasse und fügen einen Slot der Klasse hinzu, den wir mit dem '''Beenden Knopf''' verknüpfen.
Zeile 9 zeigt das Texteingabefeld auf dem Bildschirm in seinem eigenen Fenster. Da Widgets auch als Container verwendet werden können (z. B. ein &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, das Toolbars, Menüs, Statuszeile und ein Paar andere Widgets), ist es möglich ein einzelnes Widget in eigenem Fenster anzuzeigen. Widgets sind standardmäßig nicht sichtbar; die Funktion &quot;show()&quot;:http://doc.qt.nokia.com/4.7/qwidget.html#show macht sie sichtbar.


[[Image:gs3.png|QWidget Unterklasse]]
Zeile 11 läßt &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html in die Ereignisschleife eintreten. Solange eine Qt Anwendung läuft werden Ereignisse generiert und an die Widgets der Anwendung gesendet. Beispiele solcher Ereignisse sind Mausklicks oder Tastatureingaben. Wenn Sie einen Text in das Texteingabefeld eintippen empfängt es Tastatureingabe Ereignisse und beantwortet diese in dem es den eingegebenen Text darstellt.


Lassen Sie uns einen Blick auf den Code werfen:<br /> Das Q_OBJECT Makro muß an erster Stelle einer Klassendefinition stehen; es deklariert unsere Klasse als [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' (natürlich muß sie auch vom QObject abgeleitet werden). Ein [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' reichert eine gewöhnlichen C++ Klasse mit einigen Fähigkeiten an. Beachtenswert ist die Möglichkeit den Klassen- und die Slotnamen zur Laufzeit abfragen zu können. Darüber hinaus ist es möglich die Parametertypen eines Slots abzufragen und den Slot aufzurufen.
Um die Anwendung auszuführen öffnen Sie die Kommandozeile und gehen zum Verzeichnis in dem Sie die .cpp Dateien des Programms liegen haben. Folgende Shell Kommandos übersetzen und erstellen das Programm.<br /><code><br />qmake -project<br />qmake<br />make<br /></code><br />Das wird eine ausführbare Datei im part1 Verzeichnis erstellen (unter Windows werden Sie u. U. nmake anstatt make verwenden müssen. Ferner wird die ausführbare Datei in part1/debug oder part1/release erstellt). qmake is Qts Erstellprogramm, das eine Konfigurationsdatei entgegen nimmt. qmake erstellt diese für uns, wenn das Argument <s>project übergeben wird. Mit der Konfigurationsdatei (mit der Endung .pro) erstellt qmake eine make Datei, das das Programm für Sie erstellt. Wir werden uns später ansehen wie man eigene .pro Datei schreibt.
<br />h3. Mehr erfahren<br />|''. Über |''. Hier |<br />| Widgets und Fenstergeometrie | &quot;Window and Dialog Widgets&amp;quot;:http://doc.qt.nokia.com/4.7/application-windows.html |<br />| Ereignisse und ihre Behandlung | &quot;The Event System&amp;quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html |
<br />h2. Einen Beenden Knopf hinzufügen
<br />In einer echten Anwendung werden Sie mehr als nur ein Widget benötigen. Wir werden nun einen &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html unter das Texteingabefeld anbringen. Der Knopf wird die Notepad Anwendung beim Betätigen (z. B. durch das Klicken mit der Maus) beenden.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|Eingabefeld mit Beenden Knopf]]
<br />Lassen Sie uns mal einen Blick auf den Code werfen:<br /><code><br />#include &lt;QtGui&amp;gt;
<br />int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);
<br /> QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Quit&amp;quot;);
<br /> QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
<br /> QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);
<br /> QWidget window;<br /> window.setLayout(&amp;layout);
<br /> window.show();
<br /> return app.exec&amp;amp;#40;&amp;#41;;<br />}<br /></code><br />Zeile 1 fügt &quot;QtGui&amp;quot;:http://doc.qt.nokia.com/4.7/qtgui.html ein, das alle Qts GUI Klassen enthält.
<br />Zeile 10 verwendet Qts Signals and Slots Mechanismus um die Anwendung beim Drücken des '''Beenden Knopf''' zu schließen. Ein Slot ist eine Funktion, die durch die Verwendung ihres Namens (in Form einer Zeichenkette) zu Laufzeit aufgerufen werden kann. Ein Signal ist eine Funktion die, wenn aufgerufen, alle dazu registrierten Slots aufruft; wir nennen es einen Slot mit einem Signal verbinden und ein Signal erzeugen.
<br />&quot;quit()&quot;:http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit ist ein Slot der &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html, der die Anwendung beendet. &quot;clicked()&quot;:http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked ist ein Signal, das &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html erzeugt, wenn der Knopf gedrückt wird. Die statische &quot;QObject::connect()&quot;:http://doc.qt.nokia.com/4.7/qobject.html#connect Funktion sorgt für die Verbindung des Slots und des Signals. SIGNAL () und SLOT() sind zwei Makros, die die Funktionssignatur des Signal bzw. Slot entgegennehmen, die verbunden werden sollen. Ferner müssen wir die Zeiger der Objekte übergeben, das das Signal sendet bzw. empfängt.
<br />Zeile 12 erzeugt ein &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Wie bereits erwähnt können Widgets auch andere Widgets enthalten. Es ist möglich die Abgrenzungen (Größe und Position) eines Kindwidgets direkt zu setzen. Jedoch ist es einfacher ein Layout zu verwenden. Ein Layout verwaltet die Abgrenzungen der Kindwidgets. Beispielsweise positioniert &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html die Kindelemente vertikal untereinander.
<br />Zeile 13 und 14 fügen das Texteingabefeld und den Knopf dem Layout hinzu. In Zeile 17 setzen wir das Layout eines Widgets.
<br />h3. Mehr erfahren<br />|''. Über |''. Hier |<br />| Signale und Slots | &quot;Signals &amp; Slots&amp;quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html |<br />| Layouts | &quot;Layout Management&amp;quot;:http://doc.qt.nokia.com/4.7/layout.html, &quot;Widgets and Layouts&amp;quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, &quot;Layout Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html |<br />| Widgets die Qt bereitstellt | &quot;Qt Widget Gallery&amp;quot;:http://doc.qt.nokia.com/4.7/gallery.html, &quot;Widget Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html |
<br />h2. QWidget Unterklassen erstellen
<br />Wenn der Benutzer die Anwendung beenden will ist es u. U. erwünscht einen Dialog anzuzeigen, der sicherstellt, daß der Benutzer die Anwendung tatsächlich beenden möchte. In diesem Beispiel erstellen wir eine &quot;QWidget&amp;quot;:http://doc.qt.nokia.com/4.7/qwidget.html Unterklasse und fügen einen Slot der Klasse hinzu, den wir mit dem '''Beenden Knopf''' verknüpfen.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|QWidget Unterklasse]]
<br />Lassen Sie uns einen Blick auf den Code werfen:<br /><code><br />class Notepad : public QWidget<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br />private slots:<br /> void quit();
<br />private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};<br /></code><br />Das Q_OBJECT Makro muß an erster Stelle einer Klassendefinition stehen; es deklariert unsere Klasse als &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html (natürlich muß sie auch vom QObject abgeleitet werden). Ein &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html reichert eine gewöhnlichen C++ Klasse mit einigen Fähigkeiten an. Beachtenswert ist die Möglichkeit den Klassen</s> und die Slotnamen zur Laufzeit abfragen zu können. Darüber hinaus ist es möglich die Parametertypen eines Slots abzufragen und den Slot aufzurufen.


Zeile 13 deklariert den Slot quit(). Einfach durch das Benutzen des Slot Makros. Der quit() Slot kann nun mit den Signalen verbunden werden, die eine passende Signatur besitzen (Jedes Signal, das keine Argumente erwartet).
Zeile 13 deklariert den Slot quit(). Einfach durch das Benutzen des Slot Makros. Der quit() Slot kann nun mit den Signalen verbunden werden, die eine passende Signatur besitzen (Jedes Signal, das keine Argumente erwartet).


Anstatt in der main() Funktion die Benutzeroberfläche zu erstellen und den Slot zu verbinden, benutzen wir Notepads Konstruktor.<br /> Wie Sie in der Klassendefinition sehen konnten benutzen wir Zeiger unserer QObjects (textEdit und quitButton). In der Regel sollten Sie QObjects Objekte immer auf dem Heap erstellen und diese nie kopieren.
Anstatt in der main() Funktion die Benutzeroberfläche zu erstellen und den Slot zu verbinden, benutzen wir Notepads Konstruktor.<br /><code><br />Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));
 
Nun benutzen wir die [http://doc.qt.nokia.com/4.7/qobject.html#tr tr()] ''[doc.qt.nokia.com]'' Funktion um unsere sichtbaren Bezeichner. Diese Funktion ist notwendig falls Sie vorhaben Ihre Anwendung in mehreren Sprachen (z. B. Englisch und Chinesisch) bereit zu stellen. Wir werden hier jedoch nicht ins Detail gehen. Sie können dem Qt Linguist Link folgen um mehr darüber zu erfahren.
 
===Mehr erfahren {| class="infotable line" ! Über ! Hier |- | tr() und Internationalisierung | [http://doc.qt.nokia.com/4.7/linguist-manual.html Qt Linguist Manual] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/i18n-source-translation.html Writing Source Code for Translation] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/linguist-hellotr.html Hello tr()] ''[doc.qt.nokia.com]'' Example, [http://doc.qt.nokia.com/4.7/internationalization.html Internationalization with Qt] ''[doc.qt.nokia.com]'' |- | [http://doc.qt.nokia.com/4.7/qobject.html QObjects] ''[doc.qt.nokia.com]'' und das Qt Object Model (Essenziell um Qt zu verstehen) | [http://doc.qt.nokia.com/4.7/object.html Object Model] ''[doc.qt.nokia.com]'' |- | qmake und das Qt Erstellungssystem | [http://doc.qt.nokia.com/4.7/qmake-manual.html qmake Manual] ''[doc.qt.nokia.com]'' |}===
 
==Eine .pro Datei erstellen==
 
In diesem Beispiel erstellen wir unsere eigene .pro Datei, anstatt uns eine durch<br /> qmake -project Option generieren zu lassen.<br /> Die folgenden Kommandozeilen Kommandos erstellen die Beispielanwendung.<br /> h2. Die Verwendung eines QMainWindow
 
Viele Anwendungen werden durch die Verwendung von [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' ###########, das ihr eigenes Layout hat dem Sie eine Menüleiste, Dockwidgets, Werkzeugleisten und eine Statusleiste hinzufügen können. [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' besitzt einen zentralen Bereich, der durch beliebiges Widget besetzt werden kann. In unserem Fall werden wir unser Texteingabefeld dort platzieren.
 
[[Image:gs4.png|QMainWindow]]
 
Lassen Sie uns einen Blick auf die neue Notepad Klassendefinition werfen:<br /> Wir fügen zwei weitere Slots hinzu, die ein Dokument speichern und schließen. Wir werden diese im nächsten Abschnitt implementieren.
 
In einem Hauptfenster soll der gleiche Slot oft mehrfach, durch verschiedene Widgets, aufgerufen werden können. Beispiele dafür sind Menüeinträge und Knöpfe in der Werkzeugleiste. Um dieses zu vereinfachen stellt Qt [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'' bereit, die mehreren Widgets zugewiesen werden kann und mit einem Slot verbunden werden. Es können zum Beispiel sowohl [http://doc.qt.nokia.com/4.7/qmenu.html QMenu] ''[doc.qt.nokia.com]'' als auch [http://doc.qt.nokia.com/4.7/qtoolbar.html QToolBar] ''[doc.qt.nokia.com]'' Menüeinträge erzeugen unter Verwendung der gleichen [http://doc.qt.nokia.com/4.7/qaction.html QActions] ''[doc.qt.nokia.com]''. Wir werden in Kürze sehen wie das funktioniert.
 
Wie zuvor benutzen wir Notepads Konstruktur um die Benutzeroberfläche zu erstellen.<br /> “QActions“http://doc.qt.nokia.com/4.7/qaction.html werden mit dem Text erstellt, der auf dem Widget erscheinen soll, dem wir es zuweisen (in unserem Fall Menüeinträge). Falls wir sie zusätzlich auch einer Werkzeugleiste zuweisen wollten, hätten wir den Aktionen auch ein [http://doc.qt.nokia.com/4.7/qicon.html Icon] ''[doc.qt.nokia.com]'' zuweisen können.
 
Wenn nun ein Menüeintrag geklickt wird, löst der Eintrag die Aktion aus und der dazugehörige Slot wird aktiviert.
 
===Mehr erfahren {| class="infotable line" ! Über ! Hier |- | Hauptanwendungsfenster und Hauptfensterklassen | [http://doc.qt.nokia.com/4.7/mainwindow.html Application Main Window] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-mainwindow.html Main Window Examples] ''[doc.qt.nokia.com]'' |- | <span class="caps">MDI</span> applications | [http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html <span class="caps">MDI</span> Example] ''[doc.qt.nokia.com]'' |}===
 
==Speichern und Laden==
 
In diesem Beispiel werden wir die Funktionalität der open() und save() Slots implementieren, die wir im vorherigen Beispiel eingeführt haben.
 
[[Image:gs5.png|Öffnen Dialog]]
 
Wir werden mit dem open() Slot beginnen:<br /> Der erste Schritt ist den Benutzer nach dem Dateinamen der Datei zu fragen, die er öffnen möchte. Qt stellt dafür ein [http://doc.qt.nokia.com/4.7/qfiledialog.html QFileDialog] ''[doc.qt.nokia.com]'' bereit, der einen Dialog darstellt in dem der Benutzer eine Datei auswählen kann. Das obere Bild zeigt den Dialog unter Kubuntu. Die statische [http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName getOpenFileName()] ''[doc.qt.nokia.com]'' Funktion zeigt einen modalen Dateidialog bis der Benutzer eine Datei ausgewählt hat. Es liefert den Dateipfad der ausgesuchten Datei zurück oder eine leere Zeichenkette, falls der Dialog abgebrochen wurde.
 
Sobald wir einen Dateinamen haben versuchen wir die Datei mittels [http://doc.qt.nokia.com/4.7/qiodevice.html#open open()] ''[doc.qt.nokia.com]'' zu öffnen. Die open() Funktion liefert true im Erfolgsfall. Wir werden hier nicht auf die Fehlerbehandlung eingehen, auf die mehr in den “Mehr erfahren” Verknüpfungen eingegangen wird. Im Fehlerfall benutzen wir [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' um einen Dialog mit einer Fehlermeldung anzuzeigen (siehe die [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' Klasse Beschreibung für weitere Details).


Es ist recht einfach die Daten mit der Funktion [http://doc.qt.nokia.com/4.7/qiodevice.html#readAll readAll()] ''[doc.qt.nokia.com]'' einzulesen, die alle Daten einer Datei in einem [http://doc.qt.nokia.com/4.7/qbytearray.html QByteArray] ''[doc.qt.nokia.com]'' zurück gibt. Die [http://doc.qt.nokia.com/4.7/qbytearray.html#constData constData()] ''[doc.qt.nokia.com]'' Funktion gibt alle Daten in einem const char* Array zurück, zu dem [http://doc.qt.nokia.com/4.7/qstring.html QString] ''[doc.qt.nokia.com]'' einen Konstruktor bereit stellt. Der Inhalt kann danach im Texteingabefeld angezeigt werden. Danach schließen wir die Datei mittels [http://doc.qt.nokia.com/4.7/qiodevice.html#close close()] ''[doc.qt.nokia.com]'' Funktion, um den Dateidescriptor an das Betriebssystem zu übergeben.
connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));


Lassen Sie uns nun zum save() Slot übergehen.<br /> Um den Inhalt des Texteingabefeldes zurück in die Datei zu schreiben verwenden wir die [http://doc.qt.nokia.com/4.7/qtextstream.html QTextStream] ''[doc.qt.nokia.com]'' Klasse, die das [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' Objekt umhüllt. Textstream kann QStrings direkt in eine Datei schreiben; [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' akzeptiert nur rohe Daten (char*) mit der [http://doc.qt.nokia.com/4.7/qiodevice.html#write write()] ''[doc.qt.nokia.com]'' Funktion des [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]''.
QVBoxLayout '''layout = new QVBoxLayout;<br /> layout-&gt;addWidget(textEdit);<br /> layout-&gt;addWidget(quitButton);
<br /> setLayout(layout);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}<br /></code><br />Wie Sie in der Klassendefinition sehen konnten benutzen wir Zeiger unserer QObjects (textEdit und quitButton). In der Regel sollten Sie QObjects Objekte immer auf dem Heap erstellen und diese nie kopieren.
<br />Nun benutzen wir die &quot;tr()&quot;:http://doc.qt.nokia.com/4.7/qobject.html#tr Funktion um unsere sichtbaren Bezeichner. Diese Funktion ist notwendig falls Sie vorhaben Ihre Anwendung in mehreren Sprachen (z. B. Englisch und Chinesisch) bereit zu stellen. Wir werden hier jedoch nicht ins Detail gehen. Sie können dem Qt Linguist Link folgen um mehr darüber zu erfahren.
<br />h3. Mehr erfahren<br />|''. Über |''. Hier |<br />| tr() und Internationalisierung | &quot;Qt Linguist Manual&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, &quot;Writing Source Code for Translation&amp;quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, &quot;Hello tr()&quot;:http://doc.qt.nokia.com/4.7/linguist-hellotr.html Example, &quot;Internationalization with Qt&amp;quot;:http://doc.qt.nokia.com/4.7/internationalization.html |<br />| &quot;QObjects&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html und das Qt Object Model (Essenziell um Qt zu verstehen) | &quot;Object Model&amp;quot;:http://doc.qt.nokia.com/4.7/object.html |<br />| qmake und das Qt Erstellungssystem | &quot;qmake Manual&amp;quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html |
<br />h2. Eine .pro Datei erstellen
<br />In diesem Beispiel erstellen wir unsere eigene .pro Datei, anstatt uns eine durch<br />qmake <s>project Option generieren zu lassen.<br /><code><br />HEADERS = notepad.h<br />SOURCES = notepad.cpp main.cpp<br /></code><br />Die folgenden Kommandozeilen Kommandos erstellen die Beispielanwendung.<br /><code><br />qmake<br />make<br /></code><br />h2. Die Verwendung eines QMainWindow
<br />Viele Anwendungen werden durch die Verwendung von &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html profitieren, das ihr eigenes Layout hat dem Sie eine Menüleiste, Dockwidgets, Werkzeugleisten und eine Statusleiste hinzufügen können. &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html besitzt einen zentralen Bereich, der durch beliebiges Widget besetzt werden kann. In unserem Fall werden wir unser Texteingabefeld dort platzieren.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|QMainWindow]]
<br />Lassen Sie uns einen Blick auf die neue Notepad Klassendefinition werfen:<br /><code><br />#include &lt;QtGui&amp;gt;
<br />class Notepad : public QMainWindow<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br />private slots:<br /> void open();<br /> void save();<br /> void quit();
<br />private:<br /> QTextEdit *textEdit;
<br /> QAction *openAction;<br /> QAction *saveAction;<br /> QAction *exitAction;
<br /> QMenu '''fileMenu;<br />};<br /></code><br />Wir fügen zwei weitere Slots hinzu, die ein Dokument speichern und schließen. Wir werden diese im nächsten Abschnitt implementieren.
<br />In einem Hauptfenster soll der gleiche Slot oft mehrfach, durch verschiedene Widgets, aufgerufen werden können. Beispiele dafür sind Menüeinträge und Knöpfe in der Werkzeugleiste. Um dieses zu vereinfachen stellt Qt &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html bereit, die mehreren Widgets zugewiesen werden kann und mit einem Slot verbunden werden. Es können zum Beispiel sowohl &quot;QMenu&amp;quot;:http://doc.qt.nokia.com/4.7/qmenu.html als auch &quot;QToolBar&amp;quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html Menüeinträge erzeugen unter Verwendung der gleichen &quot;QActions&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html. Wir werden in Kürze sehen wie das funktioniert.
<br />Wie zuvor benutzen wir Notepads Konstruktur um die Benutzeroberfläche zu erstellen.<br /><code><br />Notepad::Notepad()<br />{<br /> openAction = new QAction(tr(&quot;&amp;Open&amp;quot;), this);<br /> saveAction = new QAction(tr(&quot;&amp;Save&amp;quot;), this);<br /> exitAction = new QAction(tr(&quot;E&amp;amp;xit&amp;quot;), this);
<br /> connect(openAction, SIGNAL (triggered()), this, SLOT (open()));<br /> connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));<br /> connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
<br /> fileMenu = menuBar()<s>&gt;addMenu(tr(&quot;&amp;File&amp;quot;));<br /> fileMenu</s>&gt;addAction(openAction);<br /> fileMenu-&gt;addAction(saveAction);<br /> fileMenu-&gt;addSeparator();<br /> fileMenu-&gt;addAction(exitAction);
<br /> textEdit = new QTextEdit;<br /> setCentralWidget(textEdit);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}<br /></code><br />&quot;QActions&amp;quot;http://doc.qt.nokia.com/4.7/qaction.html werden mit dem Text erstellt, der auf dem Widget erscheinen soll, dem wir es zuweisen (in unserem Fall Menüeinträge). Falls wir sie zusätzlich auch einer Werkzeugleiste zuweisen wollten, hätten wir den Aktionen auch ein &quot;Icon&amp;quot;:http://doc.qt.nokia.com/4.7/qicon.html zuweisen können.
<br />Wenn nun ein Menüeintrag geklickt wird, löst der Eintrag die Aktion aus und der dazugehörige Slot wird aktiviert.
<br />h3. Mehr erfahren<br />|''. Über |''. Hier |<br />| Hauptanwendungsfenster und Hauptfensterklassen | &quot;Application Main Window&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, &quot;Main Window Examples&amp;quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html |<br />| MDI applications | &quot;QMdiArea&amp;quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, &quot;MDI Example&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html |
<br />h2. Speichern und Laden
<br />In diesem Beispiel werden wir die Funktionalität der open() und save() Slots implementieren, die wir im vorherigen Beispiel eingeführt haben.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|Öffnen Dialog]]
<br />Wir werden mit dem open() Slot beginnen:<br /><code><br />QString fileName = QFileDialog::getOpenFileName(this, tr(&quot;Open File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp'''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::ReadOnly)) {<br /> QMessageBox::critical(this, tr(&quot;Error&amp;quot;),<br /> tr(&quot;Could not open file&amp;quot;));<br /> return;<br /> }<br /> QString contents = file.readAll().constData();<br /> textEdit</s>&gt;setPlainText(contents);<br /> file.close();<br />}<br /></code><br />Der erste Schritt ist den Benutzer nach dem Dateinamen der Datei zu fragen, die er öffnen möchte. Qt stellt dafür ein &quot;QFileDialog&amp;quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html bereit, der einen Dialog darstellt in dem der Benutzer eine Datei auswählen kann. Das obere Bild zeigt den Dialog unter Kubuntu. Die statische &quot;getOpenFileName()&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName Funktion zeigt einen modalen Dateidialog bis der Benutzer eine Datei ausgewählt hat. Es liefert den Dateipfad der ausgesuchten Datei zurück oder eine leere Zeichenkette, falls der Dialog abgebrochen wurde.
<br />Sobald wir einen Dateinamen haben versuchen wir die Datei mittels &quot;open()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#open zu öffnen. Die open() Funktion liefert true im Erfolgsfall. Wir werden hier nicht auf die Fehlerbehandlung eingehen, auf die mehr in den &quot;Mehr erfahren&amp;quot; Verknüpfungen eingegangen wird. Im Fehlerfall benutzen wir &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html um einen Dialog mit einer Fehlermeldung anzuzeigen (siehe die &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html Klasse Beschreibung für weitere Details).
<br />Es ist recht einfach die Daten mit der Funktion &quot;readAll()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#readAll einzulesen, die alle Daten einer Datei in einem &quot;QByteArray&amp;quot;:http://doc.qt.nokia.com/4.7/qbytearray.html zurück gibt. Die &quot;constData()&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html#constData Funktion gibt alle Daten in einem const char''' Array zurück, zu dem &quot;QString&amp;quot;:http://doc.qt.nokia.com/4.7/qstring.html einen Konstruktor bereit stellt. Der Inhalt kann danach im Texteingabefeld angezeigt werden. Danach schließen wir die Datei mittels &quot;close()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#close Funktion, um den Dateidescriptor an das Betriebssystem zu übergeben.


===Mehr erfahren {| class="infotable line" ! Über ! Hier |- | Dateien und E/A-Geräte | [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]'' |}===
Lassen Sie uns nun zum save() Slot übergehen.<br /><code><br />QString fileName = QFileDialog::getSaveFileName(this, tr(&quot;Save File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::WriteOnly)) {<br /> // error message<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit-&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br />}<br /></code><br />Um den Inhalt des Texteingabefeldes zurück in die Datei zu schreiben verwenden wir die &quot;QTextStream&amp;quot;:http://doc.qt.nokia.com/4.7/qtextstream.html Klasse, die das &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html Objekt umhüllt. Textstream kann QStrings direkt in eine Datei schreiben; &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html akzeptiert nur rohe Daten (char''') mit der &quot;write()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#write Funktion des &quot;QIODevice&amp;quot;:http://doc.qt.nokia.com/4.7/qiodevice.html.


===Categories:===
=== Mehr erfahren<br />|''. Über |''. Hier |<br />| Dateien und E/A-Geräte | &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html, &quot;QIODevice&amp;quot;:http://doc.qt.nokia.com/4.7/qiodevice.html | ===


* [[:Category:German|German]]
[[Category:Learning]]<br />[[Category:HowTo]]
* [[:Category:HowTo|HowTo]]
* [[:Category:Learning|Learning]]

Revision as of 14:25, 23 February 2015

diese Seite in: "en&quot;:http://doc.qt.nokia.com/4.7/gettingstartedqt.html, "es&quot;:http://developer.qt.nokia.com/wiki/GettingStartedQt_Spanish, "ru&quot;:http://developer.qt.nokia.com/wiki/GettingStartedWithQtRussian, "pl&quot;:http://developer.qt.nokia.com/wiki/GettingStartedQtPolish, "pt&quot;:http://developer.qt.nokia.com/wiki/gettingStartedPortuguese, "nl&quot;:http://developer.qt.nokia.com/wiki/GettingStartedQtDutch

[toc align_right="yes&quot; depth="2&quot;]

Schnelleinstieg in die Programmierung mit Qt

Willkommen in der Welt von Qt des Plattformübergreifenden GUI Framework. In dieser "Schnelleinstiegs&quot;-anleitung lehren wir grundlegendes Qt Wissen durch das Implementieren einer einfachen Notepad Anwendung. Nach dem Durchlesen dieser Anleitung sind Sie soweit in die Übersichten und API Dokumentation einzutauchen und die Informationen zu finden, die Sie für die Anwendung brauchen, die Sie entwickeln.

Hallo Notepad

In diesem ersten Beispiel werden wir ein einfaches Texteingabefeld erstellen und in einem Fenster auf dem Desktop anzeigen. Das stellt das einfachste Qt Programm mit einer Benutzeroberfläche dar.

p=. Texteingabefenster

Hier ist der Code:

<br />#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;

int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);

QTextEdit textEdit;<br /> textEdit.show();

return app.exec&amp;amp;#40;&amp;#41;;<br />}<br />


Lassen Sie uns mal Zeile für Zeile durch den Code gehen. In den ersten beiden Zeilen binden wir die Headerdateien für "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html und "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html ein, die beide Klassen darstellen, die wir für dieses Beispiel benötigen. Alle Qt Klassen haben eine Headerdatei, die den Namen der Klasse trägt.

Zeile 6 erstellt ein QApplication Objekt. Dieses Objekt behandelt anwendungsweit Ressourcen und ist notwendig für eine Qt Anwendung mit einer grafischen Benutzeroberfläche. Der Konstruktor benötigt argv und args, weil Qt ein Paar Kommandozeilenargumente entgegen nehmen kann.

Zeile 8 erstellt ein QTextEdit Objekt. Eine Texteingabefeld ist ein visuelles Element einer Benutzeroberfläche. In Qt nennen wir solche Elemente Widgets. Beispiele anderer Widgets sind Scrollbalken, Labels und Radiobuttons. Ein Widget kann auch ein Container für andere Widgets sein; ein Dialog oder ein Hauptanwendungsfenster zum Beispiel.

Zeile 9 zeigt das Texteingabefeld auf dem Bildschirm in seinem eigenen Fenster. Da Widgets auch als Container verwendet werden können (z. B. ein "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, das Toolbars, Menüs, Statuszeile und ein Paar andere Widgets), ist es möglich ein einzelnes Widget in eigenem Fenster anzuzeigen. Widgets sind standardmäßig nicht sichtbar; die Funktion "show()":http://doc.qt.nokia.com/4.7/qwidget.html#show macht sie sichtbar.

Zeile 11 läßt "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html in die Ereignisschleife eintreten. Solange eine Qt Anwendung läuft werden Ereignisse generiert und an die Widgets der Anwendung gesendet. Beispiele solcher Ereignisse sind Mausklicks oder Tastatureingaben. Wenn Sie einen Text in das Texteingabefeld eintippen empfängt es Tastatureingabe Ereignisse und beantwortet diese in dem es den eingegebenen Text darstellt.

Um die Anwendung auszuführen öffnen Sie die Kommandozeile und gehen zum Verzeichnis in dem Sie die .cpp Dateien des Programms liegen haben. Folgende Shell Kommandos übersetzen und erstellen das Programm.

<br />qmake -project<br />qmake<br />make<br />


Das wird eine ausführbare Datei im part1 Verzeichnis erstellen (unter Windows werden Sie u. U. nmake anstatt make verwenden müssen. Ferner wird die ausführbare Datei in part1/debug oder part1/release erstellt). qmake is Qts Erstellprogramm, das eine Konfigurationsdatei entgegen nimmt. qmake erstellt diese für uns, wenn das Argument project übergeben wird. Mit der Konfigurationsdatei (mit der Endung .pro) erstellt qmake eine make Datei, das das Programm für Sie erstellt. Wir werden uns später ansehen wie man eigene .pro Datei schreibt.


h3. Mehr erfahren
|. Über |. Hier |
| Widgets und Fenstergeometrie | "Window and Dialog Widgets&quot;:http://doc.qt.nokia.com/4.7/application-windows.html |
| Ereignisse und ihre Behandlung | "The Event System&quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html |
h2. Einen Beenden Knopf hinzufügen
In einer echten Anwendung werden Sie mehr als nur ein Widget benötigen. Wir werden nun einen "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html unter das Texteingabefeld anbringen. Der Knopf wird die Notepad Anwendung beim Betätigen (z. B. durch das Klicken mit der Maus) beenden.
p=. Eingabefeld mit Beenden Knopf


Lassen Sie uns mal einen Blick auf den Code werfen:

<br />#include &lt;QtGui&amp;gt;
<br />int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);
<br /> QTextEdit textEdit;<br /> QPushButton quitButton(&quot;Quit&amp;quot;);
<br /> QObject::connect(&amp;quitButton, SIGNAL (clicked()), qApp, SLOT (quit()));
<br /> QVBoxLayout layout;<br /> layout.addWidget(&amp;textEdit);<br /> layout.addWidget(&amp;quitButton);
<br /> QWidget window;<br /> window.setLayout(&amp;layout);
<br /> window.show();
<br /> return app.exec&amp;amp;#40;&amp;#41;;<br />}<br />


Zeile 1 fügt "QtGui&quot;:http://doc.qt.nokia.com/4.7/qtgui.html ein, das alle Qts GUI Klassen enthält.


Zeile 10 verwendet Qts Signals and Slots Mechanismus um die Anwendung beim Drücken des Beenden Knopf zu schließen. Ein Slot ist eine Funktion, die durch die Verwendung ihres Namens (in Form einer Zeichenkette) zu Laufzeit aufgerufen werden kann. Ein Signal ist eine Funktion die, wenn aufgerufen, alle dazu registrierten Slots aufruft; wir nennen es einen Slot mit einem Signal verbinden und ein Signal erzeugen.
"quit()":http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit ist ein Slot der "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html, der die Anwendung beendet. "clicked()":http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked ist ein Signal, das "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html erzeugt, wenn der Knopf gedrückt wird. Die statische "QObject::connect()":http://doc.qt.nokia.com/4.7/qobject.html#connect Funktion sorgt für die Verbindung des Slots und des Signals. SIGNAL () und SLOT() sind zwei Makros, die die Funktionssignatur des Signal bzw. Slot entgegennehmen, die verbunden werden sollen. Ferner müssen wir die Zeiger der Objekte übergeben, das das Signal sendet bzw. empfängt.
Zeile 12 erzeugt ein "QVBoxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Wie bereits erwähnt können Widgets auch andere Widgets enthalten. Es ist möglich die Abgrenzungen (Größe und Position) eines Kindwidgets direkt zu setzen. Jedoch ist es einfacher ein Layout zu verwenden. Ein Layout verwaltet die Abgrenzungen der Kindwidgets. Beispielsweise positioniert "QVBoxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html die Kindelemente vertikal untereinander.
Zeile 13 und 14 fügen das Texteingabefeld und den Knopf dem Layout hinzu. In Zeile 17 setzen wir das Layout eines Widgets.
h3. Mehr erfahren
|. Über |. Hier |
| Signale und Slots | "Signals & Slots&quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html |
| Layouts | "Layout Management&quot;:http://doc.qt.nokia.com/4.7/layout.html, "Widgets and Layouts&quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, "Layout Examples&quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html |
| Widgets die Qt bereitstellt | "Qt Widget Gallery&quot;:http://doc.qt.nokia.com/4.7/gallery.html, "Widget Examples&quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html |
h2. QWidget Unterklassen erstellen
Wenn der Benutzer die Anwendung beenden will ist es u. U. erwünscht einen Dialog anzuzeigen, der sicherstellt, daß der Benutzer die Anwendung tatsächlich beenden möchte. In diesem Beispiel erstellen wir eine "QWidget&quot;:http://doc.qt.nokia.com/4.7/qwidget.html Unterklasse und fügen einen Slot der Klasse hinzu, den wir mit dem Beenden Knopf verknüpfen.
p=. QWidget Unterklasse


Lassen Sie uns einen Blick auf den Code werfen:

<br />class Notepad : public QWidget<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br />private slots:<br /> void quit();
<br />private:<br /> QTextEdit *textEdit;<br /> QPushButton *quitButton;<br />};<br />


Das Q_OBJECT Makro muß an erster Stelle einer Klassendefinition stehen; es deklariert unsere Klasse als "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html (natürlich muß sie auch vom QObject abgeleitet werden). Ein "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html reichert eine gewöhnlichen C++ Klasse mit einigen Fähigkeiten an. Beachtenswert ist die Möglichkeit den Klassen
und die Slotnamen zur Laufzeit abfragen zu können. Darüber hinaus ist es möglich die Parametertypen eines Slots abzufragen und den Slot aufzurufen.

Zeile 13 deklariert den Slot quit(). Einfach durch das Benutzen des Slot Makros. Der quit() Slot kann nun mit den Signalen verbunden werden, die eine passende Signatur besitzen (Jedes Signal, das keine Argumente erwartet).

Anstatt in der main() Funktion die Benutzeroberfläche zu erstellen und den Slot zu verbinden, benutzen wir Notepads Konstruktor.

<br />Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));

connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));

QVBoxLayout '''layout = new QVBoxLayout;<br /> layout-&gt;addWidget(textEdit);<br /> layout-&gt;addWidget(quitButton);
<br /> setLayout(layout);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}<br />


Wie Sie in der Klassendefinition sehen konnten benutzen wir Zeiger unserer QObjects (textEdit und quitButton). In der Regel sollten Sie QObjects Objekte immer auf dem Heap erstellen und diese nie kopieren.


Nun benutzen wir die "tr()":http://doc.qt.nokia.com/4.7/qobject.html#tr Funktion um unsere sichtbaren Bezeichner. Diese Funktion ist notwendig falls Sie vorhaben Ihre Anwendung in mehreren Sprachen (z. B. Englisch und Chinesisch) bereit zu stellen. Wir werden hier jedoch nicht ins Detail gehen. Sie können dem Qt Linguist Link folgen um mehr darüber zu erfahren.
h3. Mehr erfahren
|. Über |. Hier |
| tr() und Internationalisierung | "Qt Linguist Manual&quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, "Writing Source Code for Translation&quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, "Hello tr()":http://doc.qt.nokia.com/4.7/linguist-hellotr.html Example, "Internationalization with Qt&quot;:http://doc.qt.nokia.com/4.7/internationalization.html |
| "QObjects&quot;:http://doc.qt.nokia.com/4.7/qobject.html und das Qt Object Model (Essenziell um Qt zu verstehen) | "Object Model&quot;:http://doc.qt.nokia.com/4.7/object.html |
| qmake und das Qt Erstellungssystem | "qmake Manual&quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html |
h2. Eine .pro Datei erstellen


In diesem Beispiel erstellen wir unsere eigene .pro Datei, anstatt uns eine durch
qmake project Option generieren zu lassen.

<br />HEADERS = notepad.h<br />SOURCES = notepad.cpp main.cpp<br />


Die folgenden Kommandozeilen Kommandos erstellen die Beispielanwendung.

<br />qmake<br />make<br />


h2. Die Verwendung eines QMainWindow


Viele Anwendungen werden durch die Verwendung von "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html profitieren, das ihr eigenes Layout hat dem Sie eine Menüleiste, Dockwidgets, Werkzeugleisten und eine Statusleiste hinzufügen können. "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html besitzt einen zentralen Bereich, der durch beliebiges Widget besetzt werden kann. In unserem Fall werden wir unser Texteingabefeld dort platzieren.
p=. QMainWindow


Lassen Sie uns einen Blick auf die neue Notepad Klassendefinition werfen:

<br />#include &lt;QtGui&amp;gt;
<br />class Notepad : public QMainWindow<br />{<br /> Q_OBJECT
<br />public:<br /> Notepad();
<br />private slots:<br /> void open();<br /> void save();<br /> void quit();
<br />private:<br /> QTextEdit *textEdit;
<br /> QAction *openAction;<br /> QAction *saveAction;<br /> QAction *exitAction;
<br /> QMenu '''fileMenu;<br />};<br />


Wir fügen zwei weitere Slots hinzu, die ein Dokument speichern und schließen. Wir werden diese im nächsten Abschnitt implementieren.


In einem Hauptfenster soll der gleiche Slot oft mehrfach, durch verschiedene Widgets, aufgerufen werden können. Beispiele dafür sind Menüeinträge und Knöpfe in der Werkzeugleiste. Um dieses zu vereinfachen stellt Qt "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html bereit, die mehreren Widgets zugewiesen werden kann und mit einem Slot verbunden werden. Es können zum Beispiel sowohl "QMenu&quot;:http://doc.qt.nokia.com/4.7/qmenu.html als auch "QToolBar&quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html Menüeinträge erzeugen unter Verwendung der gleichen "QActions&quot;:http://doc.qt.nokia.com/4.7/qaction.html. Wir werden in Kürze sehen wie das funktioniert.


Wie zuvor benutzen wir Notepads Konstruktur um die Benutzeroberfläche zu erstellen.

<br />Notepad::Notepad()<br />{<br /> openAction = new QAction(tr(&quot;&amp;Open&amp;quot;), this);<br /> saveAction = new QAction(tr(&quot;&amp;Save&amp;quot;), this);<br /> exitAction = new QAction(tr(&quot;E&amp;amp;xit&amp;quot;), this);
<br /> connect(openAction, SIGNAL (triggered()), this, SLOT (open()));<br /> connect(saveAction, SIGNAL (triggered()), this, SLOT (save()));<br /> connect(exitAction, SIGNAL (triggered()), qApp, SLOT (quit()));
<br /> fileMenu = menuBar()<s>&gt;addMenu(tr(&quot;&amp;File&amp;quot;));<br /> fileMenu</s>&gt;addAction(openAction);<br /> fileMenu-&gt;addAction(saveAction);<br /> fileMenu-&gt;addSeparator();<br /> fileMenu-&gt;addAction(exitAction);
<br /> textEdit = new QTextEdit;<br /> setCentralWidget(textEdit);
<br /> setWindowTitle(tr(&quot;Notepad&amp;quot;));<br />}<br />


"QActions&quot;http://doc.qt.nokia.com/4.7/qaction.html werden mit dem Text erstellt, der auf dem Widget erscheinen soll, dem wir es zuweisen (in unserem Fall Menüeinträge). Falls wir sie zusätzlich auch einer Werkzeugleiste zuweisen wollten, hätten wir den Aktionen auch ein "Icon&quot;:http://doc.qt.nokia.com/4.7/qicon.html zuweisen können.


Wenn nun ein Menüeintrag geklickt wird, löst der Eintrag die Aktion aus und der dazugehörige Slot wird aktiviert.
h3. Mehr erfahren
|. Über |. Hier |
| Hauptanwendungsfenster und Hauptfensterklassen | "Application Main Window&quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, "Main Window Examples&quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html |
| MDI applications | "QMdiArea&quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, "MDI Example&quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html |
h2. Speichern und Laden
In diesem Beispiel werden wir die Funktionalität der open() und save() Slots implementieren, die wir im vorherigen Beispiel eingeführt haben.
p=. Öffnen Dialog


Wir werden mit dem open() Slot beginnen:

<br />QString fileName = QFileDialog::getOpenFileName(this, tr(&quot;Open File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp'''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::ReadOnly)) {<br /> QMessageBox::critical(this, tr(&quot;Error&amp;quot;),<br /> tr(&quot;Could not open file&amp;quot;));<br /> return;<br /> }<br /> QString contents = file.readAll().constData();<br /> textEdit</s>&gt;setPlainText(contents);<br /> file.close();<br />}<br />


Der erste Schritt ist den Benutzer nach dem Dateinamen der Datei zu fragen, die er öffnen möchte. Qt stellt dafür ein "QFileDialog&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html bereit, der einen Dialog darstellt in dem der Benutzer eine Datei auswählen kann. Das obere Bild zeigt den Dialog unter Kubuntu. Die statische "getOpenFileName()":http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName Funktion zeigt einen modalen Dateidialog bis der Benutzer eine Datei ausgewählt hat. Es liefert den Dateipfad der ausgesuchten Datei zurück oder eine leere Zeichenkette, falls der Dialog abgebrochen wurde.


Sobald wir einen Dateinamen haben versuchen wir die Datei mittels "open()":http://doc.qt.nokia.com/4.7/qiodevice.html#open zu öffnen. Die open() Funktion liefert true im Erfolgsfall. Wir werden hier nicht auf die Fehlerbehandlung eingehen, auf die mehr in den "Mehr erfahren&quot; Verknüpfungen eingegangen wird. Im Fehlerfall benutzen wir "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html um einen Dialog mit einer Fehlermeldung anzuzeigen (siehe die "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html Klasse Beschreibung für weitere Details).
Es ist recht einfach die Daten mit der Funktion "readAll()":http://doc.qt.nokia.com/4.7/qiodevice.html#readAll einzulesen, die alle Daten einer Datei in einem "QByteArray&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html zurück gibt. Die "constData()":http://doc.qt.nokia.com/4.7/qbytearray.html#constData Funktion gibt alle Daten in einem const char Array zurück, zu dem "QString&quot;:http://doc.qt.nokia.com/4.7/qstring.html einen Konstruktor bereit stellt. Der Inhalt kann danach im Texteingabefeld angezeigt werden. Danach schließen wir die Datei mittels "close()":http://doc.qt.nokia.com/4.7/qiodevice.html#close Funktion, um den Dateidescriptor an das Betriebssystem zu übergeben.

Lassen Sie uns nun zum save() Slot übergehen.

<br />QString fileName = QFileDialog::getSaveFileName(this, tr(&quot;Save File&amp;quot;), &quot;&quot;,<br /> tr(&quot;Text Files ('''.txt);;C++ Files ('''.cpp '''.h)&quot;));
<br />if (fileName != &quot;&quot;) {<br /> QFile file&amp;amp;#40;fileName&amp;amp;#41;;<br /> if (!file.open(QIODevice::WriteOnly)) {<br /> // error message<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit-&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br />}<br />


Um den Inhalt des Texteingabefeldes zurück in die Datei zu schreiben verwenden wir die "QTextStream&quot;:http://doc.qt.nokia.com/4.7/qtextstream.html Klasse, die das "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html Objekt umhüllt. Textstream kann QStrings direkt in eine Datei schreiben; "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html akzeptiert nur rohe Daten (char) mit der "write()":http://doc.qt.nokia.com/4.7/qiodevice.html#write Funktion des "QIODevice&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html.

Mehr erfahren
|. Über |. Hier |
| Dateien und E/A-Geräte | "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html, "QIODevice&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html |