QT QGraphicsItemAnimation

时间:2013-05-07 17:58:32

标签: c++ qt animation

  • 我有一个类: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;

}

PAINTER:

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

我的问题是如何翻译它并改变坐标而没有这些复杂情况。

1 个答案:

答案 0 :(得分:0)

首先,我认为您误解了QGraphicsItem动画中函数setTranslationAt的使用。

动画随时间具有标准化值,因此可以从0.0开始并以1.0结束(或反向)。因此,请致电

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

您已经声明,在标准化值达到0.3时,您希望将x和y位置设置为' value'。这没关系,但你还需要为动画设置其他值(特别是在1.0的val!)。如果使用for循环,则可以迭代0.0到1.0之间的值,并设置项目位置的位置。查看QG帮助文件中QGraphicsItemAnimation的示例代码。 QGraphicsItemAnimation使用插值来计算对象在您已经给出的已知点之间的位置。如果您有兴趣: -

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

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

一旦您设置了QGraphicsItemRect的本地坐标和世界位置,您就可以使用drawRect绘制它,而不应该在paint函数中设置位置。