0
  • 私はクラスを持っています: QGraphicsRectItem から継承する mySquare
  • コンストラクター、ペインター、およびアニメーションのみを追加しました。

アニメーション:

void mySquare::animation(mySquare *k)
{
    QTimeLine *timeLine = new QTimeLine();
    timeLine->setLoopCount(1);

    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation();
    animation->setItem(k);
    animation->setTimeLine(timeLine);

    int value = 30;
    animation->setTranslationAt(0.3, value, value);

    timeLine->start();

// (*)
//        x += 30;  
//        y += 30;

}

画家:

void Klocek::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *widget)
{
bokKwadratu = (min(widget->width(), widget->height()))/5;

setRect(x * 30, y * 30, 30 - 3, 30 - 3);

QRectF rect = boundingRect();

painter->setBrush(brush);
painter->setPen(pen);

QFont font;
font.setPixelSize(bokKwadratu/3);

painter->setFont(font);
painter->drawRect(rect);
painter->drawText(rect,Qt::AlignCenter, QString::number(wartosc));
}

コンストラクタ:

mySquare::mySquare(qreal x, qreal y) : QGraphicsRectItem(x * 10, y * 10, 10, 10)
{
    setAcceptHoverEvents(true);

    this->x = x;
    this->y = y;

    pen.setColor(Qt::red);
    pen.setWidth(2);

    brush.setColor(Qt::blue);
    brush.setStyle(Qt::SolidPattern);
}
  • アニメーション(翻訳)を実行した後、オブジェクトの座標を変更して、画面上の状況に対応できるようにする必要があります。つまり、翻訳後 (30, 30) 長方形の座標を変更したい (x += 30, y += 30)
  • 私の問題は、これを実行しようとすると (コード内の (*) フラグメント) 三角形がその位置から遠く離れて配置されることです (翻訳が 2 回実行されたかのように)。

私の質問は、そのような複雑さなしにそれを翻訳して座標を変更する方法です。

4

1 に答える 1

0

まず、QGraphicsItem アニメーションでの関数 setTranslationAt の使用を誤解していると思います。

アニメーションは時間の経過とともに正規化された値を持つため、0.0 で開始して 1.0 で終了する (またはその逆) ことができます。したがって、呼び出すことによって

animation->setTranslationAt(0.3, value, value);

正規化された値が 0.3 に達した時点で、x と y の位置を「値」に設定する必要があると述べました。これで問題ありませんが、アニメーションを発生させるには他の値も設定する必要があります (特に val の 1.0 で!)。for ループを使用すると、0.0 から 1.0 までの値を反復処理して、アイテムの位置を設定することができます。QGraphicsItemAnimation の Qt ヘルプ ファイルのサンプル コードを見てください。QGraphicsItemAnimation は、補間を使用して、指定した既知のポイント間のオブジェクトの位置を計算します。興味のある方: -

http://en.wikipedia.org/wiki/Linear_interpolation

次に、アイテムの rect は、ローカル座標空間でのアイテムの定義です。したがって、軸が中心にある四角形が必要な場合は、(-w/2, -h/2, w, h) の x、y、w、h で定義します。これらはローカル座標であるため、GraphicsScene でワールド座標にマップされます。ここで、ワールド内の実際の位置を設定します。

QGraphicsItemRect のローカル座標とワールド位置を設定したら、drawRect で単純にペイントできます。ペイント関数で位置を設定する必要はありません。

于 2013-05-08T08:38:49.660 に答える