Travaux Pratiques Qt #2

Eric Lecolinet - Télécom ParisTech - Dept. INFRES

Liens utiles

Sujet

Notes préliminaires :

1e Etape: Créer un nouveau projet affichant une zone de dessin

Créer un nouveau projet Qt. Pour aller plus vite on pourra recopier les fichiers source du premier TP que l'on adaptera ensuite à l'aide de QtCreator. Pour l'instant la principale différence avec le TP précédent sera le contenu de la zone centrale : au lieu d'y placer du texte on va mettre une zone de dessin qui sera une instance d'une classe que l'on va maintenant définir.

Déclarer et implémenter une classe "zone de dessin" (dans de nouveaux fichiers .h et .cpp). Pour l'instant cette classe ne fera pas grand chose : elle doit juste hériter de QWidget et avoir un constructeur adéquat. La taille par défaut d'un QWidget étant nulle (celle-ci étant calculée à partir des enfants qu'il contient), utiliser la méthode setMinimumSize() pour imposer une taille adéquate. Faire en sorte que l'instance apparaisse dans la zone centrale, compiler et tester.

2e Etape: dessiner un trait interactivement

Modifier la classe zone de dessin de telle sorte que l'on puisse interactivement y dessiner un segment de ligne (l'événement press commence le segment, le release le termine, les moves permettent d'ajuster).

3e Etape: spécifier des attributs graphiques

Rajouter à la classe zone de dessin quelques slots permettant de spécifier des attributs graphiques typiques comme la couleur, l'épaisseur ou le style du trait.

4e Etape: choisir interactivement les attributs graphiques

Modifiez l'interface graphique (normalement créée par la classe MainWindow ou similaire, pas par la classe de la zone de dessin) de telle sorte que l'on puisse régler interactivement les paramètres définis à la question précédente. Pour l'instant on pourra faire simple, par exemple en ne considérant que quelques valeurs prédéfinies sélectionnables à l'aide de QActions.

Noter que :

5e Etape: tracer plusieurs traits

Faire en sorte que l'on puisse tracer non plus un mais plusieurs traits à la suite. Ces traits auront des attributs graphiques différents si on les modifie entre le tracé de deux traits (le changement d'attributs prenant effet sur les traits suivants). Pour ce faire il faudra créer une display list qu'on pourra implémenter, au choix, en utilisant les list (ou à la rigeur les vector) standards du C++ ou les QList de Qt. Dans tous les cas, faites attention aux fuites ou possibles plantages mémoire.

Enfin, rajouter des slots permettant de supprimer le dernier trait et de supprimer tous les traits et modifiez l'interface graphique en conséquence.

6e Etape: tracer plusieurs formes géométriques

Il s'agit maintenant de généraliser l'étape précédente de telle sorte que l'on puisse dessiner diverses formes géométriques (par exemple des traits, des rectangles, des ellipses, et - optionnellement car c'est un peu plus difficile - des polylines ou des polygones). Pour ce faire, rajouter les actions adéquates (dans un menu et la toolbar) et les rendre exclusives.

Note : les QPainterPath peuvent être utiles pour cette question car ils permettent de créer divers types de formes géométriques. Cependant n'oubliez pas que celles-ci n'auront pas toutes les mêmes attributs graphiques (cf. question précédente)

7e Etape: modifier les formes a posteriori

Cette étape vise à rajouter un mode permettant de sélectionner les formes (en cliquant dessus) de manière à pouvoir les déplacer ou à changer leurs attributs graphiques (par exemple, comme à la question 3 la couleur, l'épaisseur, le style du trait) une fois qu'elles ont été créées.

Pour déterminer quelle forme est cliquée ("picking") on utilisera les fonctions prévues à cet effet dans les classes de Qt (par exemple les fonctions d'intersection de QPainterPath si on a utilisé cette classe pour dessiner les formes).

8e Etape: éditer les attributs grâce à QtDesigner

Le but de cette question est de rajouter un panneau de contrôle à votre interface en utilisant Designer. Dans ce panneau on rajoutera quelques widgets graphiques (boutons ou sliders, etc.) qui permettront d'activer les slots déjà existants de la zone de dessin.

Pour utiliser Designer il suffit de double cliquer sur le fichier .ui dans QtCreator. Notez aussi que le constructeur de MainWindow doit commencer par ui->setupUi(this) sinon les objets spécifiés à l'aide de Designer ne seront pas créés. Pour connecter les widgets créés interactivement via Designer avec le code C++ on pourra utiliser l'autoconnexion, comme vu en cours ou l'éditeur de connexions (accessible via Editer Signaux/Slots dans le menu Edition)

9e Etape (optionnelle) : lire et sauvegarder et demander confirmation avant de quitter le programme

En s'inspirant du précédent TP, rendre les items Open et Save fonctionnels de telle sorte qu'ils permettent de sauvegarder ou de relire l'ensemble des objets crées (Noter que la plupart des objets Qt, et en particulier QPen et QPainterPath sont sérialisables).

De plus, comme pour le TP précédent, faire en sorte que l'item Quit ouvre une boîte de dialogue pour demander confirmation avant de quitter le programme. Cependant ceci n'est pas suffisant car l'utilisateur peut également quitter le programme en cliquant sur le bouton de fermeture standard à côté du titre de la fenêtre. Modifier la MainWindow afin que cette action ouvre également la boîte de dialogue de confirmation (NB: il faudra redéfinir QWidget::closeEvent()).

Pour rendre le TP

Verifiez que votre code compile et s'exécute correctement depuis une salle de TP Unix de l'Ecole. Attention: un programme qui ne compile pas ou qui plante sur une machine de l'Ecole ne sera pas examiné et sera considéré comme non rendu.

Ecrire un bref fichier README indiquant les questions traitées et contenant quelques explications que vous jugerez utiles. Ce fichier doit être au format texte (en UTF-8) ou en PDF. N'oubliez pas de mettre votre nom au moins dans le README et de préférence aussi dans les autres fichiers.

Créez un répertoire qui doit s'appeller Nom__Prenom. Si votre nom ou votre prénom a des espaces, mettez des _ à la place. Enlevez les fichiers .o puis zipper votre répertoire, soit au format .zip, soit au format .tar.gz. Aucun autre format ne sera accepté !

Aller à l'URL https://services.infres.enst.fr/rendutp/ et cliquez sur "déposer votre archive" à la ligne igr201-qt. Entrez votre nom et téléchargez votre fichier zip ou tar.gz.

Si vous répétez l'opération, seule la dernière version téléchargée sera prise en compte. La commande aperçu donne la liste des projets déposés et permet donc de vérifier que votre fichier a bien été déposé.



Eric Lecolinet - http://www.telecom-paristech.fr/~elc - Telecom ParisTech