Comment dessiner en PyQt ?
Dans Développement d'une application avec des widgets, nous avons vu comment créer
une application GUI classique, basée sur des widgets standards (champs textuels,
listes, boutons, cases à cocher, etc.). Cette approche met à la disposition du
programmeur une large boîte à outils qui permet de composer des fenêtres relativement
aisément, en s'aidant notamment de Qt Designer. Toutefois, certaines applications
nécessitent des éléments graphiques qui n'ont aucun point commun avec les widgets
proposés : un histogramme, un diagramme en camembert, une fonction trigonométrique,
etc., dans les cas les plus simples ; mais aussi, pour des applications plus complexes,
une vue temporelle de type agenda, des orbites de satellites, des graphes avec des
nœuds et des arcs, une carte avec éléments textuels surimposés, des facilités de
zoom/scrolling, des animations, des objets 3D, etc.
La technique de base pour faire ce genre de graphiques en PyQt consiste à utiliser la
classe QPainter. Elle offre les primitives pour afficher des images ou dessiner des
formes géométriques simples (segments de droite, polygones, ellipses, etc.) dans un
système de coordonnées écran, c'est-à-dire des couples de nombres entiers représentant
des positions de pixels. QPainter est accompagnée d'autres classes qui forment un
système complet de dessin appelé Paint System [12] . Ce système, quoique très puissant,
peut exiger toutefois beaucoup d'efforts de la part du programmeur : des fonctions
comme le zoom, l'animation, le glisser/déposer, la détection de collisions, la sélection
d'un élément pointé par le curseur… manquent à l'appel et doivent donc être
soigneusement programmées.
Pour pallier ces difficultés, Qt a — assez logiquement — proposé de nouvelles classes
qui s'appuient sur le Paint System pour apporter les fonctionnalités manquantes. Ainsi,
déjà en 2001 avec Qt 3, la classe QCanvas apportait un lot important de fonctions
graphiques avancées. Cette technologie a finalement abouti au framework Graphics
View, apparu en 2006 avec Qt 4.2. Ce dernier a remplacé QCanvas en proposant de
nouvelles abstractions, ainsi que des fonctions plus riches et plus flexibles. Depuis
Qt 4.2, jusqu'aux dernières versions de Qt 5, il ne cesse d'être enrichi et amélioré.
Le framework Graphics View est destiné principalement aux graphiques en 2D (la 3D
est possible, mais nécessite des techniques avancées). En 2016, le module Qt 3D a été
intégré à Qt 5.7 : il offre une palette étendue de fonctions de haut niveau pour la
visualisation 3D (et, en fait, aussi la 2D !) ; en outre, son architecture ouverte permet
l'ajout d'extensions comme la simulation physique, la détection de collision et la
174
Dans Développement d'une application avec des widgets, nous avons vu comment créer
une application GUI classique, basée sur des widgets standards (champs textuels,
listes, boutons, cases à cocher, etc.). Cette approche met à la disposition du
programmeur une large boîte à outils qui permet de composer des fenêtres relativement
aisément, en s'aidant notamment de Qt Designer. Toutefois, certaines applications
nécessitent des éléments graphiques qui n'ont aucun point commun avec les widgets
proposés : un histogramme, un diagramme en camembert, une fonction trigonométrique,
etc., dans les cas les plus simples ; mais aussi, pour des applications plus complexes,
une vue temporelle de type agenda, des orbites de satellites, des graphes avec des
nœuds et des arcs, une carte avec éléments textuels surimposés, des facilités de
zoom/scrolling, des animations, des objets 3D, etc.
La technique de base pour faire ce genre de graphiques en PyQt consiste à utiliser la
classe QPainter. Elle offre les primitives pour afficher des images ou dessiner des
formes géométriques simples (segments de droite, polygones, ellipses, etc.) dans un
système de coordonnées écran, c'est-à-dire des couples de nombres entiers représentant
des positions de pixels. QPainter est accompagnée d'autres classes qui forment un
système complet de dessin appelé Paint System [12] . Ce système, quoique très puissant,
peut exiger toutefois beaucoup d'efforts de la part du programmeur : des fonctions
comme le zoom, l'animation, le glisser/déposer, la détection de collisions, la sélection
d'un élément pointé par le curseur… manquent à l'appel et doivent donc être
soigneusement programmées.
Pour pallier ces difficultés, Qt a — assez logiquement — proposé de nouvelles classes
qui s'appuient sur le Paint System pour apporter les fonctionnalités manquantes. Ainsi,
déjà en 2001 avec Qt 3, la classe QCanvas apportait un lot important de fonctions
graphiques avancées. Cette technologie a finalement abouti au framework Graphics
View, apparu en 2006 avec Qt 4.2. Ce dernier a remplacé QCanvas en proposant de
nouvelles abstractions, ainsi que des fonctions plus riches et plus flexibles. Depuis
Qt 4.2, jusqu'aux dernières versions de Qt 5, il ne cesse d'être enrichi et amélioré.
Le framework Graphics View est destiné principalement aux graphiques en 2D (la 3D
est possible, mais nécessite des techniques avancées). En 2016, le module Qt 3D a été
intégré à Qt 5.7 : il offre une palette étendue de fonctions de haut niveau pour la
visualisation 3D (et, en fait, aussi la 2D !) ; en outre, son architecture ouverte permet
l'ajout d'extensions comme la simulation physique, la détection de collision et la
174
