动画:
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);
}
我的问题是如何翻译它并改变坐标而没有这些复杂情况。
答案 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函数中设置位置。