2009-05-06 4 views
2

Ich verwende QGraphics Objekte, um Boxen mit Pfeilen zwischen ihnen anzuzeigen. Ich möchte Animation auf diesen Pfeilen/Linien, die an einem Ende beginnt und geht zu den anderen.Animation mit QTimeline

Die Animation funktioniert gut, wenn sich die Start- und Endpositionen des Pfeils während der Ausführung von QTimeLine nicht ändern, d. H. Ich lasse die Ansicht statisch. Aber da der Benutzer die Boxen umher ziehen kann (und damit die Pfeile neu zeichnen), muss ich die Start- und Endposition innerhalb von QGraphicsItemAnimation zurücksetzen, damit die Animation der neuen Pfeillinie entspricht.

Ich habe versucht, die Start- und Endpositionen in der Malmethode des Arrow-Objekts zu aktualisieren, aber das macht die Animation einfach verrückt (sie dreht sich zufällig überall herum). Ich nehme an, es liegt daran, dass ich die Animationspositionen geändert habe, als das QTimeLine-Objekt im Zustand RUNNING war.

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); 
    } 
} 

Wie soll ich dynamisch den Start QGraphicsItemAnimation ändern und Endpositionen (0 und 1)?

Für das Endprodukt möchte ich, dass der Benutzer in der Lage ist, die Boxen zu ziehen, die Pfeile folgen (was derzeit funktioniert) und die Animation entlang der neuen Pfeilroute fortsetzen.

Wenn das nicht möglich ist, dann muss ich eine Möglichkeit finden, das Ziehen zu erfassen und die Pfeilanimation zu stoppen, bis der Benutzer freigibt und dann rate ich es zurückzusetzen ...?

Antwort

4

Ich denke, Sie müssen nur eine generische Animation, d. H. Mit QTimeLine animieren zwischen 0,0 und 1,0. Suchen Sie in der currentValue (interpolation) nach der Stelle, an der das animierte Objekt platziert werden soll. Zum Beispiel sollte das Objekt bei einem Wert von 0,5 auf halbem Weg zwischen der Start- und Endposition positioniert werden.

Beachten Sie, dass dieser Tweening-Trick nicht funktioniert, wenn sich der Abstand zwischen Anfangs- und Endposition ändert. Sie können dazu führen, dass das animierte Objekt in der Mitte der Animation vor- und zurückspringt. Ein Trick besteht darin, den Abstand zwischen der Position des animierten Objekts und der Startposition beizubehalten, und das Objekt nicht zurückzuschieben, wenn die interpolierte Entfernung für die aktuelle Zeit kleiner als die vorherige ist. Es gibt kompliziertere Techniken für das Ineinandergreifen von beweglichen Start- und Endpunkten, aber ich werde hier nicht näher darauf eingehen, es sei denn, es ist notwendig.