2009-05-06 12 views
2

J'utilise des objets QGraphics pour afficher des boîtes avec des flèches entre eux. Je veux une animation sur ces flèches/lignes qui commence à une extrémité et va à l'autre.Animation avec QTimeline

L'animation fonctionne très bien lorsque les emplacements de début et de fin de la flèche ne changent pas pendant l'exécution de QTimeLine, c'est-à-dire que je laisse la vue statique. Mais puisque l'utilisateur peut faire glisser les cases (et donc redessiner les flèches), j'ai besoin de réinitialiser la position de début et de fin à l'intérieur de QGraphicsItemAnimation pour que l'animation corresponde à la nouvelle ligne de flèche.

J'ai essayé de mettre à jour les emplacements de début et de fin dans la méthode de peinture de l'objet Flèche, mais cela rend l'animation folle (elle retourne de façon aléatoire partout). Je suppose que c'est parce que j'ai changé les positions de l'animation lorsque l'objet QTimeLine était à l'état RUNNING.

void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) 
{ 
    ... 
    ///update the arrow to have a new source and destination, draw arrow, etc 
    ... 

    if (mAnimate) 
    { 
     mAnimationObj->setPosAt(0, mSourcePoint); 
     mAnimationObj->setPosAt(1, mDestPoint); 
    } 
} 

Comment dois-je changer dynamiquement le début de QGraphicsItemAnimation et des positions extrêmes (0 et 1)?

Pour le produit final, je souhaite que l'utilisateur puisse faire glisser les boîtes, que les flèches suivent (ce qui fonctionne actuellement) et que l'animation continue le long de la nouvelle trajectoire de la flèche.

Si ce n'est pas possible, alors j'ai besoin de trouver un moyen de capturer le glisser et arrêter l'animation de la flèche jusqu'à ce que l'utilisateur libère et puis je suppose que le réinitialiser ...?

Répondre

4

Je suppose que vous devez simplement créer une animation générique, c'est-à-dire utiliser QTimeLine pour animer entre 0.0 et 1.0. De currentValue, faites le interpolation (par vous-même) pour savoir où l'objet animé doit être placé. Par exemple, pour une valeur de 0,5, l'objet doit être positionné à mi-chemin entre les positions de début et de fin. Notez que cette astuce d'interpolation ne fonctionne pas si la distance entre les positions de début et de fin change constamment. Vous pourriez faire rebondir l'objet animé au milieu de l'animation. Une astuce consiste à conserver la distance entre la position de l'objet animé et la position de départ, puis à ne pas repousser l'objet si la distance interpolée pour l'instant courant est inférieure à la précédente. Il existe des techniques plus complexes pour l'interaction entre les points de départ et d'arrivée mobiles, mais je ne vais pas en dire plus à ce sujet, à moins que cela ne soit nécessaire.