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.

Vous pouvez télécharger les ressources pour ce TP ici : TP_QT1

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 et vérifier que le programme s’execute correctement dans la console (python mainwindow.py).

Q1: Que faut il ne pas oublier pour que le code s’execute?

2e Etape: Créer une classe MainWindow

La classe MainWindow dérivera de QMainWindow. Ajouter une méthode __init__() qui ne fait rien pour le moment. Il faudra penser à rajouter from PyQt5.QtWidgets import *

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: 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() de QMainWindow) avec un menu déroulant “Fichier” (à l’aide la méthode addMenu() de la classe QMenuBar) contenant trois 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
(vous disposez de 3 fichiers .png contenant les images des
icones de ces commandes). Implémenter que ces trois actions pour pouvoir avancer rapidement dans le TP.

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

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

Option 2: Un fichier Resource.qrc vous a été fourni. Éditer et compiler ce fichier avec pyrcc5 (ou pyrcc4) pour accéder à l’une des icones dans votre code à l’aide du ‘:‘.

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 au choix 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 soit 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?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. Vous pouvez utiliser la méthode question().

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

9e Etape

Vous pouvez tester QDesigner s’il vous reste du temps et ajouter des éléments graphiques dans votre interface (Dock, label, etc.)