2009-05-06 4 views
2

私はQGraphicsオブジェクトを使用して、それらの間に矢印付きのボックスを表示しています。私は、一方の端から始まり他方の端に向かう矢印/線でアニメをしたい。QTimelineによるアニメーション

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)をどのように動的に変更する必要がありますか?

最終的には、ボックスをドラッグして矢印をフォローする(現在は機能している)と、新しい矢印ルートに沿ってアニメーションを続けるようにします。

もしそれができないのであれば、私はドラッグをキャプチャし、矢印のアニメーションを停止するまでユーザーが解放してからリセットすると思う方法を見つけ出す必要があります...?

答えて

4

一般的なアニメーションを作成するだけです(QTimeLineを使用して0.0から1.0の間でアニメーションを作成する必要があります)。 currentValueからinterpolation(自分で)を実行して、アニメーションオブジェクトを配置する必要がある場所を確認します。たとえば、値が0.5の場合、オブジェクトは開始位置と終了位置の中間に配置する必要があります。

開始位置と終了位置の間の距離が変化し続ける場合、このトゥイーントリックは機能しません。アニメーションオブジェクトがアニメーションの途中で前後にバウンスする可能性があります。これを行う1つのトリックは、アニメーションオブジェクトの位置と開始位置の間の距離を維持し、現在の時間の補間された距離が以前のものよりも小さい場合にオブジェクトを押し戻さないことです。移動開始点と終了点の間にはもっと複雑なテクニックがありますが、必要がない限り、ここで詳しく説明しません。

関連する問題