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.

Télécharger les sources nécessaires à ce TP

1e Etape: Démarrage

Ouvrir le fichier mainWindow.py avec votre éditeur de texte préféré

Créer une fonction main(args) qui sera appelé à partir du point d'entrée du programme (if __name__ == "__main__":)

Afficher une trace dans la fonction main, à l'aide de la fonction print, qui affichera les arguments passés en parametre au moment de l'execution du programme, et vérifier que le programme s'execute correctement dans la console (python3 mainwindow.py).

Q1: Que faut il ne pas oublier pour que le code s'execute? Que voyez vous au print?

2e Etape: Créer une classe MainWindow

La classe MainWindow dérivera de QMainWindow. Il faudra penser à rajouter from PyQt5.QtWidgets import *

Ajouter une constructeur qui ne fait pour le moment. Créer un instance de MainWindow dans la fonction main et afficher la fenêtre avec la méthode show(). Exécuter maintenant le code.

Q2.1: une erreur se produit à l'execution ? Que devez vous faire pour la corriger ?

Une fois l'erreur corrigée, le programme s'execute:

Q2.2: Pourquoi la fenêtre ne s'affiche pas? que faut il rajouter?

3e Etape: rajouter des widgets à MainWindow

Pour l'instant MainWindow ne fait pas grand chose de plus que QMainWindow. En s'inspirant du cours créer une barre de menu (à l'aide de la méthode menuBar() QMainWindow) avec un menu déroulant "Fichier" (à l'aide la méthode addMenu() de la classe QMenuBar) contenant des items pour activer les commandes "Open...", "Save..." ,"Copy", ... 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. Ajouter également les icons aux actions en utilisant les fichiers png fournis. .

Finalement, faire en sorte que la zone centrale de la MainWindow soit un QTextEdit à l'aide de la méthode setCentralWidget()

Option: Créer une barre de status en appelant la méthode statusBar() de la classe QMainWindow.

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. Connecter les slots aux actions correspondantes. Tester.

Q4: Comment connecter les actions aux slots ?

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.

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()).

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.

Q6: Le code ne s'execute pas correctement car vous n'avez pas acces au textEdit depuis la méthode open ou save. Comment résoudre ce problème?

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() et ignorer l'évenement).