Анимация с QTimeline - PullRequest
       10

Анимация с QTimeline

2 голосов
/ 07 мая 2009

Я использую объекты QGraphics для отображения полей со стрелками между ними. Я хочу анимацию на этих стрелках / линиях, которая начинается с одного конца и идет к другому.

Анимация прекрасно работает, когда начальное и конечное положения стрелки не меняются во время выполнения QTimeLine, т.е. я оставляю представление статичным. Но так как пользователь может перетаскивать прямоугольники (и, таким образом, я перерисовываю стрелки, чтобы следовать за ними), мне нужно сбросить начальную и конечную позиции внутри QGraphicsItemAnimation, чтобы анимация соответствовала новой линии стрелки.

Я попытался обновить начальную и конечную точки в методе рисования объекта Arrow, но это просто сводит анимацию с ума (она случайным образом переворачивается повсюду). Я предполагаю, что это потому, что я изменил позиции анимации, когда объект QTimeLine находился в состоянии 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);   
    }
}

Как мне динамически изменить начальную и конечную позиции QGraphicsItemAnimation (0 и 1)?

Для конечного продукта я хочу, чтобы пользователь мог перетаскивать прямоугольники вокруг, следить за стрелками (что в настоящее время работает), а также продолжать анимацию вдоль нового маршрута со стрелкой.

Если это невозможно, тогда мне нужно найти способ захватить перетаскивание и остановить анимацию стрелки, пока пользователь не отпустит, а затем, я думаю, сбросить его ...?

1 Ответ

4 голосов
/ 28 мая 2009

Полагаю, вам просто нужно сделать общую анимацию, то есть использовать QTimeLine для анимации между 0,0 и 1,0. Из его currentValue выполните интерполяцию (самостоятельно), чтобы узнать, где нужно разместить анимированный объект. Например, для значения 0,5 объект должен быть расположен на полпути между начальной и конечной позициями.

Обратите внимание, что этот трюк не работает, если расстояние между начальной и конечной позициями постоянно меняется. Вы можете заставить анимированный объект подпрыгивать вперед и назад в середине анимации. Один из способов сделать это - сохранить расстояние между положением анимированного объекта и начальной позицией, а затем не отталкивать объект назад, если интерполированное расстояние для текущего времени меньше предыдущего. Существуют более сложные приемы для перемещения между начальной и конечной точками, но я не буду здесь останавливаться на этом подробнее, за исключением случаев, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...