0
  • 我有一个类:mySquare,它继承自 QGraphicsRectItem
  • 只添加了我的构造函数、画家和动画:

动画:

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)
  • 我的问题是,当我尝试执行此操作时(代码中的 (*) 片段),三角形远离其位置(就像翻译执行了两次一样)

我的问题是如何翻译它并更改坐标而不会出现这种复杂情况。

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

其次,item的rect是item在其局部坐标空间中的定义。因此,如果您想要一个其轴位于中心的矩形,您可以使用 (-w/2, -h/2, w, h) 的 x,y,w,h 来定义它。由于这些是本地坐标,因此它们会被映射到 GraphicsScene 中的世界坐标,您可以在其中设置其在世界中的实际位置。

一旦你设置了 QGraphicsItemRect 的本地坐标和世界位置,你就可以简单地用 drawRect 绘制它,并且不应该在绘制函数中设置位置。

于 2013-05-08T08:38:49.660 回答