Getting Started on the Commandline/fr: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
=Commencer à programmer avec Qt=
[toc align_right="yes" depth="3"]


Bienvenue dans le monde de Qt – la librairie <span class="caps">GUI</span> multiplateforme. Dans ce guide d’introduction, nous apprendrons les bases de Qt en créant un simple Bloc-Notes. Après avoir lu ce guide, vous devrez être prêt à chercher dans nos comptes-rendus et dans la documentation afin de trouver les informations nécessaires à l’application que vous développer.
= Commencer à programmer avec Qt =


==Bonjour Bloc-Notes==
Bienvenue dans le monde de Qt - la librairie GUI multiplateforme. Dans ce guide d'introduction, nous apprendrons les bases de Qt en créant un simple Bloc-Notes. Après avoir lu ce guide, vous devrez être prêt à chercher dans nos comptes-rendus et dans la documentation afin de trouver les informations nécessaires à l'application que vous développer.


Dans ce premier exemple, nous créons et affichons un simple champ d’édition de texte dans une fenêtre sur le bureau. C’est le programme le plus simple que l’on puisse faire avec une interface graphique.
== Bonjour Bloc-Notes ==


[[Image:gs1.png]]
Dans ce premier exemple, nous créons et affichons un simple champ d'édition de texte dans une fenêtre sur le bureau. C'est le programme le plus simple que l'on puisse faire avec une interface graphique.


Voici le code :<br />
p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs1.png|http://doc.qt.nokia.com/4.7/images/gs1.png]]


Analysons le code ligne par ligne.<br /> Dans les deux premières lignes, nous incluons les fichiers en-têtes [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' et [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]'', qui sont les classes dont nous avons besoin dans cet exemple. Toutes les classes de Qt ont des en-têtes respectifs.
Voici le code :<br /><code>#include &lt;QApplication&amp;gt;<br />#include &lt;QTextEdit&amp;gt;


À la ligne 6, nous créons un objet [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]''. Cet objet gère les ressources de l’application et est requis pour n’importe quel programme Qt qui a une interface graphique. Il prend les paramètres ''argv'' et ''args'' car Qt accepte les paramètres en ligne de commande.
int main(int argv, char **args)<br />{<br /> QApplication app(argv, args);


La ligne 8 crée un objet [http://doc.qt.nokia.com/4.7/qtextedit.html QTextEdit] ''[doc.qt.nokia.com]''. Un champ d’édition de texte est un élément graphique dans une interface graphique. Dans Qt, nous les appelons des widgets. Des exemples de widgets sont les barres de défilement, les étiquettes, ou les cases d’options. Un widget peut aussi contenir d’autres widgets; une fenêtre par exemple, est un widget qui en contient d’autres.
QTextEdit textEdit;<br /> textEdit.show();


À la ligne 9, nous affichons le champ d’édition de texte à l’écran dans la propre fenêtre. Puisque les widgets sont aussi des conteneurs (par exemple un objet [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' qui a des barres d’outils, des menus, une barre de status, et d’autres widgets), il est possible de les afficher dans leur propre fenêtre. Les widgets de sont pas visibles par défaut; la fonction [http://doc.qt.nokia.com/4.7/qwidget.html#show show()] ''[doc.qt.nokia.com]'' le rend visible.
return app.exec&amp;amp;#40;&amp;#41;;<br />}</code>


La ligne 11 fait entrer le [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]'' dans un boucle d’évènements. Quand une application Qt est lancée, des évènements sont générés et envoyés aux widgets de l’application. Des exemples d’évènements sont les clics de souris ou les touches de clavier. Quand vous écrivez dans le champ de texte, il reçoit des évènements de touches de claviers appuyées et réagit en écrivant le texte tapé.
Analysons le code ligne par ligne.<br />Dans les deux premières lignes, nous incluons les fichiers en-têtes &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html et &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html, qui sont les classes dont nous avons besoin dans cet exemple. Toutes les classes de Qt ont des en-têtes respectifs.


Pour lancer l’application, lancez une console, allez dans le répertoire où est situé le .cpp du programme. Les commandes suivantes compile le programme.<br />
À la ligne 6, nous créons un objet &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html. Cet objet gère les ressources de l'application et est requis pour n'importe quel programme Qt qui a une interface graphique. Il prend les paramètres ''argv'' et ''args'' car Qt accepte les paramètres en ligne de commande.


Cela créera un exécutable dans le dossier ''part1'' (notez que sous Windows, il faudra peut-être utilisez ''nmake'' au lieu de ''make''. L’exécutable créé sera placé dans ''part1/debug'' ou ''part1/release''). ''qmake'' est l’outil de Qt, qui à partir d’un fichier de configuration .pro, créé avec le paramètre -project, génère un ''make'' file qui compilera le programme pour vous. Nous étudierons la création de nos propres .pro plus tard.
La ligne 8 crée un objet &quot;QTextEdit&amp;quot;:http://doc.qt.nokia.com/4.7/qtextedit.html. Un champ d'édition de texte est un élément graphique dans une interface graphique. Dans Qt, nous les appelons des widgets. Des exemples de widgets sont les barres de défilement, les étiquettes, ou les cases d'options. Un widget peut aussi contenir d'autres widgets; une fenêtre par exemple, est un widget qui en contient d'autres.


===Plus d’informations===
À la ligne 9, nous affichons le champ d'édition de texte à l'écran dans la propre fenêtre. Puisque les widgets sont aussi des conteneurs (par exemple un objet &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html qui a des barres d'outils, des menus, une barre de status, et d'autres widgets), il est possible de les afficher dans leur propre fenêtre. Les widgets de sont pas visibles par défaut; la fonction &quot;show()&quot;:http://doc.qt.nokia.com/4.7/qwidget.html#show le rend visible.


{| class="infotable line"
La ligne 11 fait entrer le &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html dans un boucle d'évènements. Quand une application Qt est lancée, des évènements sont générés et envoyés aux widgets de l'application. Des exemples d'évènements sont les clics de souris ou les touches de clavier. Quand vous écrivez dans le champ de texte, il reçoit des évènements de touches de claviers appuyées et réagit en écrivant le texte tapé.
| À propos de
| Ici
|-
| Les widgets et la géométrie des fenêtres
|
[http://doc.qt.nokia.com/4.7/application-windows.html Fenêtres et boites de dialogue] ''[doc.qt.nokia.com]''
|-
| Les évènements et leur gestion
|
[http://doc.qt.nokia.com/4.7/eventsandfilters.html Le système d’évènement] ''[doc.qt.nokia.com]''
|}


==Ajouter un bouton Quitter==
Pour lancer l'application, lancez une console, allez dans le répertoire où est situé le .cpp du programme. Les commandes suivantes compile le programme.<br /><code>qmake -project<br />qmake<br />make</code>


Dans une application normale, vous aurez normalement plus d’un widget. Nous ajouterons un objet [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' en dessous du champ de texte. Ce bouton quittera le Bloc-Notes lorsqu’il sera cliqué.
Cela créera un exécutable dans le dossier ''part1'' (notez que sous Windows, il faudra peut-être utilisez ''nmake'' au lieu de ''make''. L'exécutable créé sera placé dans ''part1/debug'' ou ''part1/release''). ''qmake'' est l'outil de Qt, qui à partir d'un fichier de configuration .pro, créé avec le paramètre <s>project, génère un ''make'' file qui compilera le programme pour vous. Nous étudierons la création de nos propres .pro plus tard.
<br />h3. Plus d'informations
<br />|À propos de|Ici|<br />|Les widgets et la géométrie des fenêtres|&quot;Fenêtres et boites de dialogue&amp;quot;:http://doc.qt.nokia.com/4.7/application-windows.html|<br />|Les évènements et leur gestion|&quot;Le système d'évènement&amp;quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html|
<br />h2. Ajouter un bouton Quitter
<br />Dans une application normale, vous aurez normalement plus d'un widget. Nous ajouterons un objet &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html en dessous du champ de texte. Ce bouton quittera le Bloc-Notes lorsqu'il sera cliqué.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs2.png|http://doc.qt.nokia.com/4.7/images/gs2.png]]
<br />Regardons le code.<br /><code>#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 />}</code>
<br />À la ligne 1, nous incluons &quot;QtGui&amp;quot;:http://doc.qt.nokia.com/4.7/qtgui.html, qui contient toutes les classes graphiques de Qt.
<br />À la ligne 10, nous utilisons le système de signaux et de slots de Qt pour quitter l'application quand le bouton ''Quit'' est cliqué. Un slot est une fonction qui peut être appelée à l'exécution grâce à son nom. Un signal est une fonction qui lorsqu'elle est appelée appelle les slots qui lui sont connectés. On dit qu'on connecte un slot à un signal et qu'on émet un signal.
<br />&quot;quit()&quot;:http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit est un slot de &quot;QApplication&amp;quot;:http://doc.qt.nokia.com/4.7/qapplication.html.<br />&quot;clicked()&quot;:http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked est un signal qu'un &quot;QPushButton&amp;quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html émet lorsqu'il est cliqué.<br />La focntion statique &quot;QObject::connect()&quot;:http://doc.qt.nokia.com/4.7/qobject.html#connect permet de connecter le slot au signal.<br />''SIGNAL ()_ et _SLOT()'' sont deux macros qui prennent la signature du signal et du slot à connecter. Il faut aussi donner des pointeurs vers les objets qui envoient et reçoivent le signal.
<br />La ligne 12 crée un objet &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Nous avons dit que les widgets peuvent en contenir d'autres. Il est possible de stipuler les bords de chaque widgets (position et taille), mais il est souvent plus simple d'utiliser un layout. Un layout s'occupe de définir les bords de chaque widget fils. &quot;QVBoxLayout&amp;quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html par exemple, met les widgets fils en rang vertical.
<br />Les lignes 13 et 14 ajoute le champ de texte et le bouton au layout. À la ligne 17, nous assignons le layout à un widget, ici la fenêtre.
<br />h3. Plus d'informations
<br />|À propos de|Ici|<br />|Les signaux et les slots|&quot;Signaux &amp; slots&amp;quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html|<br />|Les layouts|&quot;Gestion des layouts&amp;quot;:http://doc.qt.nokia.com/4.7/layout.html, &quot;Widgets et layouts&amp;quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, &quot;Exemples de layout&amp;quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html|<br />|Les différents widgets de Qt|&quot;Gallerie de widgets Qt&amp;quot;:http://doc.qt.nokia.com/4.7/gallery.html, &quot;Exemples de widgets&amp;quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html|
<br />h2. Hériter QWidget
<br />Quand l'utilisateur quitte une application, on peut vouloir ajouter une boite de dialogue pour demander de confirmer avant de quitter.<br />Dans cet exemple, nous créons une classe qui hérite de &quot;QWidget&amp;quot;:http://doc.qt.nokia.com/4.7/qwidget.html, et nous ajoutons un slot à connecter au bouton pour quitter.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs3.png|http://doc.qt.nokia.com/4.7/images/gs3.png]]


[[Image:gs2.png]]
<br />Regardons le code :<br /><code>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 />};</code>
<br />La macro Q_OBJECT doit être située en premier dans la classe, et déclare notre classe comme un &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html (Bien sûr, elle doit aussi héritée de &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html). Un objet &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html ajoute quelques possibilités supplémentaires par rapport à une classe normale de C+''. Par exemple, le nom de la classe et de ses slots peut être récupéré à l'exécution, ainsi que les paramètres d'un slot.
<br />La ligne 13 déclare le slot ''quit()'', avec la macro ''slots''. Le slot ''quit()'' peut maintenant être connecter à n'importe quel signal avec la même signature, c'est-à-dire aucuns paramètres.
<br />Au lieu de créer l'interface et de connecter le slot dans la fonction ''main()'', nous le faisons dans le constructeur de la classe ''Notepad''.<br /><code>Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));
<br /> connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));
<br /> 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 />}</code>


Regardons le code.<br />
<br />Comme vu dans la déclaration de la classe, nous utilisons des pointeurs vers nos &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html (''textEdit'' et ''quitButton''). Vous devriez toujours allouez des &quot;QObject&amp;quot;:http://doc.qt.nokia.com/4.7/qobject.html dynamiquement et ne jamais les copier.
<br />Nous utilisons maintenant les fonction ''tr()'' pour nos variables textes. Cette fonction est nécessaire pour fournir une traduction à votre application. Nous n'entrerons pas dans les détails, mais vous pouvez vous renseignez avec le lien ''Qt Linguist'' dans ''Plus d'informations''
<br />h3. Plus d'informations
<br />|À propos de|Ici|<br />|tr() et la traduction|&quot;Documentation de Qt Linguist&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, &quot;Écrire du code source pour traduire&amp;quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, &quot;Exemples de tr() avec Hello World&amp;quot;:http://doc.qt.nokia.com/4.7/linguist-hellotr.html, &quot;Internationalisation avec Qt&amp;quot;:http://doc.qt.nokia.com/4.7/internationalization.html|<br />|&quot;QObjects&amp;quot;:http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html#qobjects et la programmation orientée objet avec Qt (Essentiel pour comprendre Qt)|&quot;La programmation orientée objet&amp;quot;:http://doc.qt.nokia.com/4.7/object.html|<br />|qmake et la compilation avec Qt|&quot;Documentation de qmake&amp;quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html|
<br />h2. Créer un fichier .pro
<br />Pour cet exemple, nous créons notre propre fichier .pro au lieu d'utiliser l'option <s>project de ''qmake''.<br /><code>HEADERS = notepad.h<br />SOURCES = notepad.cpp main.cpp</code>
<br />Les commandes suivantes compile alors l'exemple.<br /><code>qmake<br />make</code>
<br />h2. Utiliser QMainWindow
<br />Pleins d'applications profiterons de l'utilisation de &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, qui a son propre layout qui permet d'ajouter une barre de menu, des barres d'outils, des docks, et une barre de statut. &quot;QMainWindow&amp;quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html a une partie centrale qui peut être occuper par n'importe quel widget. Pour notre Bloc-Notes, nous placerons notre champ de texte ici.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs4.png|http://doc.qt.nokia.com/4.7/images/gs4.png]]
<br />Regardons la nouvelle déclaration de ''Notepad''
<br /><code>#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 />};</code>
<br />Nous ajoutons deux slots supplémentaires pour sauvegarder et ouvrir un document. Nous les implémenterons après.
<br />Souvent, dans une fenêtre, le même slot peut être appelé par plusieurs widgets. Par exemple dans la barre de menus et dans une barre d'outils. Pour rendre ceci plus facile, Qt propose &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html qui peut être donné à plusieurs widgets et être connecté à un slot. Par exemple, &quot;QMenu&amp;quot;:http://doc.qt.nokia.com/4.7/qmenu.html et &quot;QToolBar&amp;quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html permettent de créer des menus et des boutons à partir d'une même &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html. Nous verrons comment cela fonctionne.
<br />Comme précédemment, nous utilisons le constructeur pour mettre en place l'interface graphique.<br /><code>Notepad::Notepad()<br />{<br /> saveAction = 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 />}</code>
<br />Les &quot;QAction&amp;quot;:http://doc.qt.nokia.com/4.7/qaction.html sont créés à partir du texte à afficher sur les widgets auxquels nous les ajoutons (ici, des éléments de menu ). Si nous voulions les ajoutez à une barre d'outils, nous aurions aussi pu définir des icones.
<br />Lorsqu'un élément du menu est cliqué, l'élément déclenchera l'action, et le slot connecté sera appelé.
<br />h3. Plus d'informations
<br />|À propos de|Ici|<br />|Les fenêtres principales et leurs sous classes|&quot;Fenêtres principales&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, &quot;Exemples de fenêtre principales&amp;quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html|<br />|Interfaces à plusieurs documents (MDI)|&quot;QMdiArea&amp;quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, &quot;Exemples de MDI&amp;quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html|
<br />h2. Sauvegarder et charger
<br />Dans cet exemple, nous implémenterons les fonctionnalités des slots ''open()'' et ''save()'' que nous avions ajoutés précédemment.
<br />p=. [[Image:http://doc.qt.nokia.com/4.7/images/gs5.png|http://doc.qt.nokia.com/4.7/images/gs5.png]]
<br />Commencons avec le slot ''open()''.<br /><code> 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 /> }</code>
<br />La première étape est de demander à l'utilisateur le nom du fichier à ouvrir. Qt propose &quot;QFileDialog&amp;quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html, qui est une boite de dialogue pour sélectionner un fichier (Ici sous Kubuntu). La fonction statique &quot;getOpenFileName()&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName permet d'en afficher une, et ne se termine pas tant qu'un fichier n'a pas été sélectionné. Elle retourne le chemin vers le fichier sélectionné, ou une chaine vide si l'utilisateur annule l'action.
<br />Si nous obtenons un nom de fichier, nous essayons de l'ouvrir avec &quot;open()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#open, qui retourne ''true'' si le fichier a pu être ouvert. Nous ne traiterons pas de la gestion d'erreurs ici, mais des liens sont disponibles dans la section ''Plus d'informations''. Si le fichier ne peut pas être ouvert, nous utilisons un &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html pour afficher une boite de dialogue avec l'erreur (en anglais, voir la documentation sur &quot;QMessageBox&amp;quot;:http://doc.qt.nokia.com/4.7/qmessagebox).
<br />Lire les données est simple avec la fonction &quot;readAll()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#readAll, qui retourne toutes les données dans un &quot;QByteArray&amp;quot;:http://doc.qt.nokia.com/4.7/qbytearray.html. La fonction &quot;constData()&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html#constData retourne ces données dans une chaine en tant que ''const char*'', dont &quot;QString&amp;quot;:http://doc.qt.nokia.com/4.7/qstring.html possède un constructeur pour. Le contenu est ensuite affiché dans le champ de texte.<br />Enfin, nous fermons le fichier avec la fonction &quot;close()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#close
<br />Maintenant, occupons-nous du slot ''save()''.<br /><code> 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 /> // сообщение об ошибке<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit</s>&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br /> }</code>


À la ligne 1, nous incluons [http://doc.qt.nokia.com/4.7/qtgui.html QtGui] ''[doc.qt.nokia.com]'', qui contient toutes les classes graphiques de Qt.
Lorsque nous écrivons le contenu du champ de texte dans le fichier, nous utilisons la classe &quot;QTextStream&amp;quot;:http://doc.qt.nokia.com/4.7/qtextstream.html, qui englobe la classe &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html. Le flux textuel peut écrire des &quot;QString&amp;quot;:http://doc.qt.nokia.com/4.7.qstring.html directement dans le fichier, alors que &quot;QFile&amp;quot;:http://doc.qt.nokia.com/4.7/qfile.html n'accepte que les données sous forme de ''char*'' avec la méthode &quot;write()&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html#write de &quot;QIODevice&amp;quot;:http://doc.qt.nokia.com/4.7/qiodevice.html.


À la ligne 10, nous utilisons le système de signaux et de slots de Qt pour quitter l’application quand le bouton ''Quit'' est cliqué. Un slot est une fonction qui peut être appelée à l’exécution grâce à son nom. Un signal est une fonction qui lorsqu’elle est appelée appelle les slots qui lui sont connectés. On dit qu’on connecte un slot à un signal et qu’on émet un signal.
=== Plus d'informations ===


[http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit quit()] ''[doc.qt.nokia.com]'' est un slot de [http://doc.qt.nokia.com/4.7/qapplication.html QApplication] ''[doc.qt.nokia.com]''.<br />[http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked clicked()] ''[doc.qt.nokia.com]'' est un signal qu’un [http://doc.qt.nokia.com/4.7/qpushbutton.html QPushButton] ''[doc.qt.nokia.com]'' émet lorsqu’il est cliqué.<br /> La focntion statique [http://doc.qt.nokia.com/4.7/qobject.html#connect QObject::connect()] ''[doc.qt.nokia.com]'' permet de connecter le slot au signal.<br />''<span class="caps">SIGNAL</span>'' et ''<span class="caps">SLOT</span>'' sont deux macros qui prennent la signature du signal et du slot à connecter. Il faut aussi donner des pointeurs vers les objets qui envoient et reçoivent le signal.
{|
 
|À propos de
La ligne 12 crée un objet [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]''. Nous avons dit que les widgets peuvent en contenir d’autres. Il est possible de stipuler les bords de chaque widgets (position et taille), mais il est souvent plus simple d’utiliser un layout. Un layout s’occupe de définir les bords de chaque widget fils. [http://doc.qt.nokia.com/4.7/qvboxlayout.html QVBoxLayout] ''[doc.qt.nokia.com]'' par exemple, met les widgets fils en rang vertical.
|Ici
 
Les lignes 13 et 14 ajoute le champ de texte et le bouton au layout. À la ligne 17, nous assignons le layout à un widget, ici la fenêtre.
 
===Plus d’informations===
 
{| class="infotable line"
| À propos de
| Ici
|-
| Les signaux et les slots
|
[http://doc.qt.nokia.com/4.7/signalsandslots.html Signaux &amp; slots] ''[doc.qt.nokia.com]''
|-
| Les layouts
|
[http://doc.qt.nokia.com/4.7/layout.html Gestion des layouts] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/widgets-and-layouts.html Widgets et layouts] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-layouts.html Exemples de layout] ''[doc.qt.nokia.com]''
|-
| Les différents widgets de Qt
|
[http://doc.qt.nokia.com/4.7/gallery.html Gallerie de widgets Qt] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-widgets.html Exemples de widgets] ''[doc.qt.nokia.com]''
|}
 
==Hériter QWidget==
 
Quand l’utilisateur quitte une application, on peut vouloir ajouter une boite de dialogue pour demander de confirmer avant de quitter.<br /> Dans cet exemple, nous créons une classe qui hérite de [http://doc.qt.nokia.com/4.7/qwidget.html QWidget] ''[doc.qt.nokia.com]'', et nous ajoutons un slot à connecter au bouton pour quitter.
 
[[Image:gs3.png]]
 
Regardons le code :<br />
 
La macro Q_OBJECT doit être située en premier dans la classe, et déclare notre classe comme un [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' (Bien sûr, elle doit aussi héritée de [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]''). Un objet [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' ajoute quelques possibilités supplémentaires par rapport à une classe normale de C++. Par exemple, le nom de la classe et de ses slots peut être récupéré à l’exécution, ainsi que les paramètres d’un slot.
 
La ligne 13 déclare le slot ''quit()'', avec la macro ''slots''. Le slot ''quit()'' peut maintenant être connecter à n’importe quel signal avec la même signature, c’est-à-dire aucuns paramètres.
 
Au lieu de créer l’interface et de connecter le slot dans la fonction ''main()'', nous le faisons dans le constructeur de la classe ''Notepad''.<br />
 
Comme vu dans la déclaration de la classe, nous utilisons des pointeurs vers nos [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' (''textEdit'' et ''quitButton''). Vous devriez toujours allouez des [http://doc.qt.nokia.com/4.7/qobject.html QObject] ''[doc.qt.nokia.com]'' dynamiquement et ne jamais les copier.
 
Nous utilisons maintenant les fonction ''tr()'' pour nos variables textes. Cette fonction est nécessaire pour fournir une traduction à votre application. Nous n’entrerons pas dans les détails, mais vous pouvez vous renseignez avec le lien ''Qt Linguist'' dans ''Plus d’informations''
 
===Plus d’informations===
 
{| class="infotable line"
| À propos de
| Ici
|-
| tr() et la traduction
|
[http://doc.qt.nokia.com/4.7/linguist-manual.html Documentation de Qt Linguist] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/i18n-source-translation.html Écrire du code source pour traduire] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/linguist-hellotr.html Exemples de tr() avec Hello World] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/internationalization.html Internationalisation avec Qt] ''[doc.qt.nokia.com]''
|-
|
[http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html#qobjects QObjects] ''[doc.qt.nokia.com]'' et la programmation orientée objet avec Qt (Essentiel pour comprendre Qt)
|
[http://doc.qt.nokia.com/4.7/object.html La programmation orientée objet] ''[doc.qt.nokia.com]''
|-
| qmake et la compilation avec Qt
|
[http://doc.qt.nokia.com/4.7/qmake-manual.html Documentation de qmake] ''[doc.qt.nokia.com]''
|}
 
==Créer un fichier .pro==
 
Pour cet exemple, nous créons notre propre fichier .pro au lieu d’utiliser l’option -project de ''qmake''.<br />
 
Les commandes suivantes compile alors l’exemple.<br />
 
==Utiliser QMainWindow==
 
Pleins d’applications ########### de l’utilisation de [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'', qui a son propre layout qui permet d’ajouter une barre de menu, des barres d’outils, des docks, et une barre de statut. [http://doc.qt.nokia.com/4.7/qmainwindow.html QMainWindow] ''[doc.qt.nokia.com]'' a une partie centrale qui peut être occuper par n’importe quel widget. Pour notre Bloc-Notes, nous placerons notre champ de texte ici.
 
[[Image:gs4.png]]
 
Regardons la nouvelle déclaration de ''Notepad''
 
Nous ajoutons deux slots supplémentaires pour sauvegarder et ouvrir un document. Nous les implémenterons après.
 
Souvent, dans une fenêtre, le même slot peut être appelé par plusieurs widgets. Par exemple dans la barre de menus et dans une barre d’outils. Pour rendre ceci plus facile, Qt propose [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'' qui peut être donné à plusieurs widgets et être connecté à un slot. Par exemple, [http://doc.qt.nokia.com/4.7/qmenu.html QMenu] ''[doc.qt.nokia.com]'' et [http://doc.qt.nokia.com/4.7/qtoolbar.html QToolBar] ''[doc.qt.nokia.com]'' permettent de créer des menus et des boutons à partir d’une même [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]''. Nous verrons comment cela fonctionne.
 
Comme précédemment, nous utilisons le constructeur pour mettre en place l’interface graphique.<br />
 
Les [http://doc.qt.nokia.com/4.7/qaction.html QAction] ''[doc.qt.nokia.com]'' sont créés à partir du texte à afficher sur les widgets auxquels nous les ajoutons (ici, des éléments de menu ). Si nous voulions les ajoutez à une barre d’outils, nous aurions aussi pu définir des icones.
 
Lorsqu’un élément du menu est cliqué, l’élément déclenchera l’action, et le slot connecté sera appelé.
 
===Plus d’informations===
 
{| class="infotable line"
| À propos de
| Ici
|-
| Les fenêtres principales et leurs sous classes
|
[http://doc.qt.nokia.com/4.7/mainwindow.html Fenêtres principales] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/examples-mainwindow.html Exemples de fenêtre principales] ''[doc.qt.nokia.com]''
|-
| Interfaces à plusieurs documents (<span class="caps">MDI</span>)
|
[http://doc.qt.nokia.com/4.7/qmdiarea.html QMdiArea] ''[doc.qt.nokia.com]'', [http://doc.qt.nokia.com/4.7/mainwindows-mdi.html Exemples de <span class="caps">MDI</span>] ''[doc.qt.nokia.com]''
|}
 
==Sauvegarder et charger==
 
Dans cet exemple, nous implémenterons les fonctionnalités des slots ''open()'' et ''save()'' que nous avions ajoutés précédemment.
 
[[Image:gs5.png]]
 
Commencons avec le slot ''open()''.<br />
 
La première étape est de demander à l’utilisateur le nom du fichier à ouvrir. Qt propose [http://doc.qt.nokia.com/4.7/qfiledialog.html QFileDialog] ''[doc.qt.nokia.com]'', qui est une boite de dialogue pour sélectionner un fichier (Ici sous Kubuntu). La fonction statique [http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName getOpenFileName()] ''[doc.qt.nokia.com]'' permet d’en afficher une, et ne se termine pas tant qu’un fichier n’a pas été sélectionné. Elle retourne le chemin vers le fichier sélectionné, ou une chaine vide si l’utilisateur annule l’action.
 
Si nous obtenons un nom de fichier, nous essayons de l’ouvrir avec [http://doc.qt.nokia.com/4.7/qiodevice.html#open open()] ''[doc.qt.nokia.com]'', qui retourne ''true'' si le fichier a pu être ouvert. Nous ne traiterons pas de la gestion d’erreurs ici, mais des liens sont disponibles dans la section ''Plus d’informations''. Si le fichier ne peut pas être ouvert, nous utilisons un [http://doc.qt.nokia.com/4.7/qmessagebox.html QMessageBox] ''[doc.qt.nokia.com]'' pour afficher une boite de dialogue avec l’erreur (en anglais, voir la documentation sur [http://doc.qt.nokia.com/4.7/qmessagebox QMessageBox] ''[doc.qt.nokia.com]'').
 
Lire les données est simple avec la fonction [http://doc.qt.nokia.com/4.7/qiodevice.html#readAll readAll()] ''[doc.qt.nokia.com]'', qui retourne toutes les données dans un [http://doc.qt.nokia.com/4.7/qbytearray.html QByteArray] ''[doc.qt.nokia.com]''. La fonction [http://doc.qt.nokia.com/4.7/qbytearray.html#constData constData()] ''[doc.qt.nokia.com]'' retourne ces données dans une chaine en tant que ''const char*'', dont [http://doc.qt.nokia.com/4.7/qstring.html QString] ''[doc.qt.nokia.com]'' possède un constructeur pour. Le contenu est ensuite affiché dans le champ de texte.<br /> Enfin, nous fermons le fichier avec la fonction [http://doc.qt.nokia.com/4.7/qiodevice.html#close close()] ''[doc.qt.nokia.com]''
 
Maintenant, occupons-nous du slot ''save()''.<br />
 
Lorsque nous écrivons le contenu du champ de texte dans le fichier, nous utilisons la classe [http://doc.qt.nokia.com/4.7/qtextstream.html QTextStream] ''[doc.qt.nokia.com]'', qui englobe la classe [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]''. Le flux textuel peut écrire des [http://doc.qt.nokia.com/4.7.qstring.html QString] ''[doc.qt.nokia.com]'' directement dans le fichier, alors que [http://doc.qt.nokia.com/4.7/qfile.html QFile] ''[doc.qt.nokia.com]'' n’accepte que les données sous forme de ''char*'' avec la méthode [http://doc.qt.nokia.com/4.7/qiodevice.html#write write()] ''[doc.qt.nokia.com]'' de [http://doc.qt.nokia.com/4.7/qiodevice.html <span class="caps">QIOD</span>evice] ''[doc.qt.nokia.com]''.
 
===Plus d’informations===
 
{| class="infotable line"
| À propos de
| Ici
|-
| Les fichiers et les appareils de lecture/écriture
|
[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]''
|}
|}

Revision as of 10:09, 24 February 2015

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

Commencer à programmer avec Qt

Bienvenue dans le monde de Qt - la librairie GUI multiplateforme. Dans ce guide d'introduction, nous apprendrons les bases de Qt en créant un simple Bloc-Notes. Après avoir lu ce guide, vous devrez être prêt à chercher dans nos comptes-rendus et dans la documentation afin de trouver les informations nécessaires à l'application que vous développer.

Bonjour Bloc-Notes

Dans ce premier exemple, nous créons et affichons un simple champ d'édition de texte dans une fenêtre sur le bureau. C'est le programme le plus simple que l'on puisse faire avec une interface graphique.

p=. http://doc.qt.nokia.com/4.7/images/gs1.png

Voici le code :

#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 />}

Analysons le code ligne par ligne.
Dans les deux premières lignes, nous incluons les fichiers en-têtes "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html et "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html, qui sont les classes dont nous avons besoin dans cet exemple. Toutes les classes de Qt ont des en-têtes respectifs.

À la ligne 6, nous créons un objet "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html. Cet objet gère les ressources de l'application et est requis pour n'importe quel programme Qt qui a une interface graphique. Il prend les paramètres argv et args car Qt accepte les paramètres en ligne de commande.

La ligne 8 crée un objet "QTextEdit&quot;:http://doc.qt.nokia.com/4.7/qtextedit.html. Un champ d'édition de texte est un élément graphique dans une interface graphique. Dans Qt, nous les appelons des widgets. Des exemples de widgets sont les barres de défilement, les étiquettes, ou les cases d'options. Un widget peut aussi contenir d'autres widgets; une fenêtre par exemple, est un widget qui en contient d'autres.

À la ligne 9, nous affichons le champ d'édition de texte à l'écran dans la propre fenêtre. Puisque les widgets sont aussi des conteneurs (par exemple un objet "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html qui a des barres d'outils, des menus, une barre de status, et d'autres widgets), il est possible de les afficher dans leur propre fenêtre. Les widgets de sont pas visibles par défaut; la fonction "show()":http://doc.qt.nokia.com/4.7/qwidget.html#show le rend visible.

La ligne 11 fait entrer le "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html dans un boucle d'évènements. Quand une application Qt est lancée, des évènements sont générés et envoyés aux widgets de l'application. Des exemples d'évènements sont les clics de souris ou les touches de clavier. Quand vous écrivez dans le champ de texte, il reçoit des évènements de touches de claviers appuyées et réagit en écrivant le texte tapé.

Pour lancer l'application, lancez une console, allez dans le répertoire où est situé le .cpp du programme. Les commandes suivantes compile le programme.

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

Cela créera un exécutable dans le dossier part1 (notez que sous Windows, il faudra peut-être utilisez nmake au lieu de make. L'exécutable créé sera placé dans part1/debug ou part1/release). qmake est l'outil de Qt, qui à partir d'un fichier de configuration .pro, créé avec le paramètre project, génère un make file qui compilera le programme pour vous. Nous étudierons la création de nos propres .pro plus tard.
h3. Plus d'informations
|À propos de|Ici|
|Les widgets et la géométrie des fenêtres|"Fenêtres et boites de dialogue&quot;:http://doc.qt.nokia.com/4.7/application-windows.html%7C
|Les évènements et leur gestion|"Le système d'évènement&quot;:http://doc.qt.nokia.com/4.7/eventsandfilters.html%7C
h2. Ajouter un bouton Quitter
Dans une application normale, vous aurez normalement plus d'un widget. Nous ajouterons un objet "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html en dessous du champ de texte. Ce bouton quittera le Bloc-Notes lorsqu'il sera cliqué.
p=. http://doc.qt.nokia.com/4.7/images/gs2.png


Regardons le code.

#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 />}


À la ligne 1, nous incluons "QtGui&quot;:http://doc.qt.nokia.com/4.7/qtgui.html, qui contient toutes les classes graphiques de Qt.
À la ligne 10, nous utilisons le système de signaux et de slots de Qt pour quitter l'application quand le bouton Quit est cliqué. Un slot est une fonction qui peut être appelée à l'exécution grâce à son nom. Un signal est une fonction qui lorsqu'elle est appelée appelle les slots qui lui sont connectés. On dit qu'on connecte un slot à un signal et qu'on émet un signal.
"quit()":http://doc.qt.nokia.com/4.7/qcoreapplication.html#quit est un slot de "QApplication&quot;:http://doc.qt.nokia.com/4.7/qapplication.html.
"clicked()":http://doc.qt.nokia.com/4.7/qabstractbutton.html#clicked est un signal qu'un "QPushButton&quot;:http://doc.qt.nokia.com/4.7/qpushbutton.html émet lorsqu'il est cliqué.
La focntion statique "QObject::connect()":http://doc.qt.nokia.com/4.7/qobject.html#connect permet de connecter le slot au signal.
SIGNAL ()_ et _SLOT() sont deux macros qui prennent la signature du signal et du slot à connecter. Il faut aussi donner des pointeurs vers les objets qui envoient et reçoivent le signal.
La ligne 12 crée un objet "QVBoxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html. Nous avons dit que les widgets peuvent en contenir d'autres. Il est possible de stipuler les bords de chaque widgets (position et taille), mais il est souvent plus simple d'utiliser un layout. Un layout s'occupe de définir les bords de chaque widget fils. "QVBoxLayout&quot;:http://doc.qt.nokia.com/4.7/qvboxlayout.html par exemple, met les widgets fils en rang vertical.
Les lignes 13 et 14 ajoute le champ de texte et le bouton au layout. À la ligne 17, nous assignons le layout à un widget, ici la fenêtre.
h3. Plus d'informations
|À propos de|Ici|
|Les signaux et les slots|"Signaux & slots&quot;:http://doc.qt.nokia.com/4.7/signalsandslots.html%7C
|Les layouts|"Gestion des layouts&quot;:http://doc.qt.nokia.com/4.7/layout.html, "Widgets et layouts&quot;:http://doc.qt.nokia.com/4.7/widgets-and-layouts.html, "Exemples de layout&quot;:http://doc.qt.nokia.com/4.7/examples-layouts.html%7C
|Les différents widgets de Qt|"Gallerie de widgets Qt&quot;:http://doc.qt.nokia.com/4.7/gallery.html, "Exemples de widgets&quot;:http://doc.qt.nokia.com/4.7/examples-widgets.html%7C
h2. Hériter QWidget
Quand l'utilisateur quitte une application, on peut vouloir ajouter une boite de dialogue pour demander de confirmer avant de quitter.
Dans cet exemple, nous créons une classe qui hérite de "QWidget&quot;:http://doc.qt.nokia.com/4.7/qwidget.html, et nous ajoutons un slot à connecter au bouton pour quitter.
p=. http://doc.qt.nokia.com/4.7/images/gs3.png


Regardons le code :

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 />};


La macro Q_OBJECT doit être située en premier dans la classe, et déclare notre classe comme un "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html (Bien sûr, elle doit aussi héritée de "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html). Un objet "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html ajoute quelques possibilités supplémentaires par rapport à une classe normale de C+. Par exemple, le nom de la classe et de ses slots peut être récupéré à l'exécution, ainsi que les paramètres d'un slot.
La ligne 13 déclare le slot quit(), avec la macro slots. Le slot quit() peut maintenant être connecter à n'importe quel signal avec la même signature, c'est-à-dire aucuns paramètres.


Au lieu de créer l'interface et de connecter le slot dans la fonction main(), nous le faisons dans le constructeur de la classe Notepad.

Notepad::Notepad()<br />{<br /> textEdit = new QTextEdit;<br /> quitButton = new QPushButton(tr(&quot;Quit&amp;quot;));
<br /> connect(quitButton, SIGNAL (clicked()), this, SLOT (quit()));
<br /> 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 />}


Comme vu dans la déclaration de la classe, nous utilisons des pointeurs vers nos "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html (textEdit et quitButton). Vous devriez toujours allouez des "QObject&quot;:http://doc.qt.nokia.com/4.7/qobject.html dynamiquement et ne jamais les copier.
Nous utilisons maintenant les fonction tr() pour nos variables textes. Cette fonction est nécessaire pour fournir une traduction à votre application. Nous n'entrerons pas dans les détails, mais vous pouvez vous renseignez avec le lien Qt Linguist dans Plus d'informations
h3. Plus d'informations
|À propos de|Ici|
|tr() et la traduction|"Documentation de Qt Linguist&quot;:http://doc.qt.nokia.com/4.7/linguist-manual.html, "Écrire du code source pour traduire&quot;:http://doc.qt.nokia.com/4.7/i18n-source-translation.html, "Exemples de tr() avec Hello World&quot;:http://doc.qt.nokia.com/4.7/linguist-hellotr.html, "Internationalisation avec Qt&quot;:http://doc.qt.nokia.com/4.7/internationalization.html%7C
|"QObjects&quot;:http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html#qobjects et la programmation orientée objet avec Qt (Essentiel pour comprendre Qt)|"La programmation orientée objet&quot;:http://doc.qt.nokia.com/4.7/object.html%7C
|qmake et la compilation avec Qt|"Documentation de qmake&quot;:http://doc.qt.nokia.com/4.7/qmake-manual.html%7C
h2. Créer un fichier .pro


Pour cet exemple, nous créons notre propre fichier .pro au lieu d'utiliser l'option project de qmake.

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


Les commandes suivantes compile alors l'exemple.

qmake<br />make


h2. Utiliser QMainWindow
Pleins d'applications profiterons de l'utilisation de "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html, qui a son propre layout qui permet d'ajouter une barre de menu, des barres d'outils, des docks, et une barre de statut. "QMainWindow&quot;:http://doc.qt.nokia.com/4.7/qmainwindow.html a une partie centrale qui peut être occuper par n'importe quel widget. Pour notre Bloc-Notes, nous placerons notre champ de texte ici.
p=. http://doc.qt.nokia.com/4.7/images/gs4.png
Regardons la nouvelle déclaration de Notepad


#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 />};


Nous ajoutons deux slots supplémentaires pour sauvegarder et ouvrir un document. Nous les implémenterons après.
Souvent, dans une fenêtre, le même slot peut être appelé par plusieurs widgets. Par exemple dans la barre de menus et dans une barre d'outils. Pour rendre ceci plus facile, Qt propose "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html qui peut être donné à plusieurs widgets et être connecté à un slot. Par exemple, "QMenu&quot;:http://doc.qt.nokia.com/4.7/qmenu.html et "QToolBar&quot;:http://doc.qt.nokia.com/4.7/qtoolbar.html permettent de créer des menus et des boutons à partir d'une même "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html. Nous verrons comment cela fonctionne.


Comme précédemment, nous utilisons le constructeur pour mettre en place l'interface graphique.

Notepad::Notepad()<br />{<br /> saveAction = 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 />}


Les "QAction&quot;:http://doc.qt.nokia.com/4.7/qaction.html sont créés à partir du texte à afficher sur les widgets auxquels nous les ajoutons (ici, des éléments de menu ). Si nous voulions les ajoutez à une barre d'outils, nous aurions aussi pu définir des icones.
Lorsqu'un élément du menu est cliqué, l'élément déclenchera l'action, et le slot connecté sera appelé.
h3. Plus d'informations
|À propos de|Ici|
|Les fenêtres principales et leurs sous classes|"Fenêtres principales&quot;:http://doc.qt.nokia.com/4.7/mainwindow.html, "Exemples de fenêtre principales&quot;:http://doc.qt.nokia.com/4.7/examples-mainwindow.html%7C
|Interfaces à plusieurs documents (MDI)|"QMdiArea&quot;:http://doc.qt.nokia.com/4.7/qmdiarea.html, "Exemples de MDI&quot;:http://doc.qt.nokia.com/4.7/mainwindows-mdi.html%7C
h2. Sauvegarder et charger
Dans cet exemple, nous implémenterons les fonctionnalités des slots open() et save() que nous avions ajoutés précédemment.
p=. http://doc.qt.nokia.com/4.7/images/gs5.png


Commencons avec le slot open().

 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 /> }


La première étape est de demander à l'utilisateur le nom du fichier à ouvrir. Qt propose "QFileDialog&quot;:http://doc.qt.nokia.com/4.7/qfiledialog.html, qui est une boite de dialogue pour sélectionner un fichier (Ici sous Kubuntu). La fonction statique "getOpenFileName()":http://doc.qt.nokia.com/4.7/qfiledialog.html#getOpenFileName permet d'en afficher une, et ne se termine pas tant qu'un fichier n'a pas été sélectionné. Elle retourne le chemin vers le fichier sélectionné, ou une chaine vide si l'utilisateur annule l'action.
Si nous obtenons un nom de fichier, nous essayons de l'ouvrir avec "open()":http://doc.qt.nokia.com/4.7/qiodevice.html#open, qui retourne true si le fichier a pu être ouvert. Nous ne traiterons pas de la gestion d'erreurs ici, mais des liens sont disponibles dans la section Plus d'informations. Si le fichier ne peut pas être ouvert, nous utilisons un "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox.html pour afficher une boite de dialogue avec l'erreur (en anglais, voir la documentation sur "QMessageBox&quot;:http://doc.qt.nokia.com/4.7/qmessagebox).
Lire les données est simple avec la fonction "readAll()":http://doc.qt.nokia.com/4.7/qiodevice.html#readAll, qui retourne toutes les données dans un "QByteArray&quot;:http://doc.qt.nokia.com/4.7/qbytearray.html. La fonction "constData()":http://doc.qt.nokia.com/4.7/qbytearray.html#constData retourne ces données dans une chaine en tant que const char*, dont "QString&quot;:http://doc.qt.nokia.com/4.7/qstring.html possède un constructeur pour. Le contenu est ensuite affiché dans le champ de texte.
Enfin, nous fermons le fichier avec la fonction "close()":http://doc.qt.nokia.com/4.7/qiodevice.html#close


Maintenant, occupons-nous du slot save().

 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 /> // сообщение об ошибке<br /> } else {<br /> QTextStream stream(&amp;file);<br /> stream &lt;&lt; textEdit</s>&gt;toPlainText();<br /> stream.flush();<br /> file.close();<br /> }<br /> }

Lorsque nous écrivons le contenu du champ de texte dans le fichier, nous utilisons la classe "QTextStream&quot;:http://doc.qt.nokia.com/4.7/qtextstream.html, qui englobe la classe "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html. Le flux textuel peut écrire des "QString&quot;:http://doc.qt.nokia.com/4.7.qstring.html directement dans le fichier, alors que "QFile&quot;:http://doc.qt.nokia.com/4.7/qfile.html n'accepte que les données sous forme de char* avec la méthode "write()":http://doc.qt.nokia.com/4.7/qiodevice.html#write de "QIODevice&quot;:http://doc.qt.nokia.com/4.7/qiodevice.html.

Plus d'informations

À propos de Ici