I. Qui est Thierry Bastian ?

Thierry Bastian est un français diplômé en informatique à l'école d'ingénieur ESIAL de Nancy. Thierry a intégré Trolltech en 2006 et travaille depuis 4 ans en tant que développeur sur le framework Qt. Il fait partie de l'équipe « Widget » et passe la plus grande partie de son temps à travailler sur le multimédia, l'animation et les autres tâches liées aux widgets.

II. Pourquoi ce framework ?

La naissance du framework animation vient du besoin de simplifier la création d'animation dans les interfaces utilisateurs modernes en améliorant le support de ces dites animations dans Qt. Avant la création de ce framework, il était possible de réaliser des animations dans une interface graphique à l'aide du QTimer et du rafraîchissement régulier de l'application mais un tel développement été très fastidieux pour le programmeur. Ce framework fait donc son apparition dans le projet QtKinetic ainsi que dans la version 4.6 de Qt avec trois objectifs principaux :

  • Bonne API d'animation,
  • Développement d'animations simplifié,
  • Performances.

III. Architecture

Image non disponible
Figure 1 : Architecture du framework Animation

III-A. QAbstractAnimation

Il s'agit de la classe de base du framework qui gère complètement le timer et ses événements ainsi que la synchronisation avec les autres éléments. Il comporte tous les contrôles basiques d'une animation. À savoir : start, stop, pause.

Voici les propriétés principales de cette classe :

  • loopCount : le nombre deboucles de l'animation ;
  • duration : la durée de l'animation ;
  • direction : le sens de l'animation (il est possible d'inverser très facilement la lecture de l'animation) ;
  • currentTime : le temps courant de l'animation et la progression ;
Image non disponible
Figure 2 : Propriétés de la classe QAbstractAnimation

III-B. QVariantAnimation

Cette classe est basée sur QVariant et hérite de QAbstractAnimation. Elle gère la valeur de départ (startValue) et de fin (endValue) d'une animation ainsi que les trames clés (key frames). Elle permet la gestion des interpolations linéaires (possibilité de créer ses propres interpolations) ainsi que des courbes assouplies (easingcurve). Dans le cas d'animations d'une classe non QObject, il est nécessaire de réimplémenter cette classe.

III-C. QPropertyAnimation

Cette classe est utilisée pour animer les propriétés dans Qt (QtProperties). Elle permet de travailler avec les propriétés d'un objet (autorise la gestion dynamique des propriétés) et c'est principalement cette classe que l'on va utiliser.

Code simple d'animation d'un bouton :

Code simple d'animation d'un bouton
Sélectionnez
QPushButton button("Animated Button");
button.show();
QPropertyAnimation animation(&button, "geometry");
animation.setDuration(3000);
animation.setStartValue(QRect(0, 0, 100, 30));
animation.setEndValue(QRect(250, 250, 100, 30));
animation.setEasingCurve(QEasingCurve::OutBounce);
animation.start();

III-D. QAnimationGroup

Cette classe est un conteneur d'animations dans le cadre d'animation complexes. Elle permet de gérer des animations à la fois de façon séquentielle et parallèle en même temps (cf. ). La durée de l'animation est alors définie par le conteneur.

Image non disponible
Figure 3 : Représentation des animations de groupe

La démo Animatetiles fournie dans les exemples de Qt est un bon exemple des animations parallèles. Chaque cercle est une animation jouée en parallèle des autres.

IV. La gestion de la mémoire

Les classes d'animation ont une relation parent-enfant avec QObject, ce qui permet une bonne gestion de la mémoire. Par exemple, les animations de groupes contiennent les animations internes au groupe ce qui permet la suppression automatique des objets enfants due à la règle de suppression en orienté objet.

V. Utilisation

Un développeur aura sûrement pour objectif d'animer des éléments dans un QGraphicsView. Cependant un QGraphicsView est composé de QGraphicsItem, qui ne possèdent pas de propriétés système, n'héritant pas de QObject. L'utilisation des QGraphicsItem devient alors un problème et son développement très ardu. C'est pourquoi il a été décidé d'arrêter le support de cette classe pour se concentrer sur les classes héritant de QObject, d'où l'apparition d'une nouvelle classe QGraphicsObject.

Pour le programmeur, 3 options s'offrent à lui pour réaliser des animations dans son interface graphique :

  • L'utilisation de la nouvelle classe QGraphicsObject ;
  • L'héritage d'une classe perso avec QObject ;
  • L'utilisation des transformations avec QGraphicsTransform.

QGraphicsItem devient alors une classe dépréciée dans les futures versions du framework Qt. La classe QGraphicsTransform est à utiliser dans le cas d'objets complexes pour des effets de 3D (2,5 D plus exactement) étant donné que chaque QGraphicsItem possède une liste de QGraphicsTransform.

La meilleure solution pour l'animation est bien sûr l'utilisation de la nouvelle classe QGraphicsObject. Elle est la base commune de tous les nouveaux éléments graphiques et n'est rien d'autre que ce qu'aurait dû être QGraphicsItem depuis le début.

VI. États et transitions

Le framework de la machine à états (state machine) fait également partie du projet Qt Kinetic ainsi que de la version 4.6 de Qt. Il peut être utilisé en complémentarité avec le framework Animation. Chaque état permet de définir des propriétés telles qu'une position, une dimension, une rotation ou une opacité. Toutes les transitions entre états peuvent alors être animées grâce au framework Animation.

Image non disponible
Figure 4 : Architecture de l'utilisation des animations avec la machine à états

VII. Conclusion

Le framework Animation fait maintenant partie de la version 4.6 de Qt. Il possède une très bonne intégration avec la machine à états également disponible depuis la version 4.6. L'animation d'objets et plus particulièrement de QGraphicsObject est une des bases des interfaces graphiques déclaratives. L'équipe du framework Animation travaille actuellement sur l'animation des gestionnaires de dispositions (layout) qui devrait être une future évolution de ce framework très prometteur.