Le TP s'appuie sur celui d'Eric Lecolinet

Sujet

Note préliminaire : il est préférable de lire chaque "étape" en entier (en particulier les notes ou remarques) avant de la traiter.

1e Etape: Démarrage

Lancer l'IDE QtCreator (via le menu Programmation ou en tapant qtcreator & dans le Terminal), puis sélectionner :

Cinq fichiers ont été créés par QtCreator :

Regardez le contenu de ces fichiers. Les seuls que nous aurons besoin de modifier aujourd'hui sont ceux de la classe MainWindow, c'est-à-dire mainwindow.h et mainwindow.cpp. Le fichier main.cpp est standard et n'a généralement pas besoin d'être modifié. D'autres fichiers seront ensuite crées par QtCreator (l'exécutable, les .o, des fichiers moc_*, etc.) soit dans ce reépartoire, soit dans un répertoire caché suivant la version de QtCreator.

2e Etape: rajouter des widgets à MainWindow

La classe MainWindow dérive de QMainWindow. Elle va vous permettre d'implémenter les fonctionnalités nécessaires pour faire ce TP. Pour l'instant elle ne fait pas grand chose de plus que QMainWindow. Pour voir ce que ca donne, compiler et exécuter en cliquant sur la flèche verte en bas à gauche de QtCreator. Remarquer la barre Compilation un peu plus haut. Celle-ci est grise en cours de compilation, verte si la compilation a réussi et rouge sinon. En cliquant sur cette barre on fait apparaitre (ou disparaitre) les erreurs.

En s'inspirant du cours créer une barre de menu avec un menu déroulant "Fichier" contenant des items pour activer les commandes "Open...", "Save..." et "Quit...". Créer également une barre d'outils permettant d'activer les mêmes commandes. Utiliser les QAction en spécifiant les accélérateurs clavier et bulles d'aides appropriés (on supposera que l'on dispose de 3 fichiers .png contenant les images des icones de ces commandes). Implémenter que quelques actions pour pouvoir avancer rapidement dans le TP. Finalement, faire en sorte que la zone centrale de la MainWindow soit un QTextEdit (penser à inclure le header approprié). Compiler et exécuter.

Remarque : QtCreator ajoute automatiquement la ligne ui->setupUi(this); dans le code du constructeur de MainWindow. Ceci sert à instancier l'interface graphique créée à l'aide de QtDesigner. Comme pour l'instant on ne s'en sert pas, il faut commenter cette ligne et créer une barre de status en appelant la méthode statusBar() de la classe QtMainWindow.

3e Etape: ajouter des ressources

Télecharger des fichiers .png contenant les images des icones dans un sous-répertoire de votre projet Qt (vous pouvez par exemple télécharger ces fichiers d'icones). Assurez-vous que les noms indiqués dans le code source correspondent à ceux des fichiers, puis faire :

Un fichier de ressources (extension .qrc est alors créé). Il faut alors ajouter interactivement un Préfixe (qui sera du type "/truc" ou truc est le répertoire contenant les fichiers des icones), puis chacun de ces Fichiers. Recompiler et vérifier que la barre de menu affiche bien les icones.

4e Etape: définir et connecter les slots

Déclarer et implémenter les slots openFile(), saveFile() et quitApp(). Pour l'instant ils se contenteront d'afficher un message (e.g. le nom du slot) sur la console (NB: si on utilise cout et endl ne pas oublier qu'ils sont dans le namespace std et qu'il faut inclure le header iostream). Connecter les slots aux actions correspondantes. Compiler et tester.

5e Etape: ouvrir une boîte de dialogue pour sélectionner un fichier

On va maintenant faire en sorte que les slots openFile() et saveFile() ouvrent des boîtes de dialogue permettant de récupérer un nom de fichier. C'est le rôle du widget QFileDialog, qui peut être utilisé de plusieurs manières. En s'inspirant du cours, choisir la technique la plus simple, tant pour ouvrir un "Open" qu'un "Save" Dialog. Recupérer le nom du fichier sélectionné et l'afficher sur la console.

Remarques:

6e Etape: ouvrir / sauver une page HTML

On va maintenant rajouter le code nécessaire dans le slot openFile() pour lire le fichier (texte ou HTML) sélectionné via la boîte de dialogue et faire apparaître son contenu dans le QTextEdit. Pour ce faire, on utilisera un QFile et un QTextStream pour lire le fichier. Pour simplifier tout le contenu du fichier sera lu en une seule fois dans le QTextStream. Ce contenu sera alors affecté au QTextEdit via sa méthode setHtml(). Cette méthode suppose que le contenu est du HTML (pour du texte brut on utiliserait plutot setPlainText()). Un simple fichier html (Hello World.html) est disponible dans le répertoire.

Inversement, en suivant la même logique, faire en sorte que le slot saveFile() sauvegarde le contenu du QTextEdit dans le fichier indiqué par la boîte de dialogue. Remarque: on pourra utiliser l'opérateur << du QFile.

7e Etape: ouvrir une boîte de dialogue pour demander confirmation

Faire en sorte qu'appuyer sur le bouton Quit ait pour effet d'ouvrir un QMessageBox comportant des boutons "Yes" et "No" permettant de demander confirmation avant de sortir de l'application.

8e Etape: demander confirmation dans tous les cas

L'étape précédente comporte une faille. En effet, l'utilisateur peut aussi quitter le programme en cliquant sur le bouton présent sur la barre de la fenêtre (généralement une croix, ou un bouton rouge). Modifier la MainWindow de telle sorte que cette action ait le même effet que lorsqu'on clique sur le bouton Quit, c'est-à-dire ouvrir une boîte de dialogue pour demander confirmation. (Indication : il faudra redéfinir QWidget::closeEvent()).


[an error occurred while processing this directive]