Le TP s'appuie sur celui d'Eric Lecolinet
Note préliminaire : il est préférable de lire chaque "étape" en entier (en particulier les notes ou remarques) avant de la traiter.
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 :
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.
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 :
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.
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:
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.
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.
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()).