QGraphics的QPropertyAnimation不起作用

时间:2017-06-19 16:47:14

标签: qt

所以我在stackoverflow上看过其他类似的问题,但似乎没有任何帮助。问题是动画没有发生,但是一旦我点击QGraphicsView中的某个地方,它就会更新到结束位置。

我用QPropertyAnimation动画QGraphicsRectItem,所以我创建了一个新类并扩展了QObject和QGraphicsRectItem:

class MyGraphicsRectItem : public QObject, public QGraphicsRectItem {
        Q_OBJECT
        Q_PROPERTY(QPointF position READ position WRITE setPosition)
        Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)
    public:
        ...
        QPointF position();
        void setPosition(QPointF animBox);
        QRectF geometry();
        void setGeometry(QRectF geo);
        ...
}

关于这个问题的一个常见问题是当函数完成时QPropertyAnimation超出范围,但我认为我使用QAbstractAnimation :: DeleteWhenStopped来规避这个问题。在我的MainWindow.cpp中,我有:

group = new QParallelAnimationGroup;
for (int i = 0; i < 10 ; i += 1) {
    MyGraphicsRectItem *temp = dynamic_cast<MyGraphicsRectItem*>(histZToItem[i]);
    QPropertyAnimation *anim = new QPropertyAnimation(temp, "position");
    anim->setDuration(500);
    anim->setStartValue(temp->pos());
    QPropertyAnimation *geo = new QPropertyAnimation(temp, "geometry");
    geo->setDuration(500);
    geo->setStartValue(temp->rect());
    geo->setEndValue(QRectF(0, 0, colWidth, -80));
    if (i > anchorID) {
       anim->setEndValue(QPointF(40 + spaceWidth * (i) + colWidth * (i - 1), graphScene->height() - 40));
    } else {
       anim->setEndValue(QPointF(40 + spaceWidth * (i + 1) + colWidth * (i), graphScene->height() - 40));
    }
    group->addAnimation(geo);
    group->addAnimation(anim);
}
group->start(QAbstractAnimation::DeleteWhenStopped); 

有什么想法吗?

修改 以下是我对position,setPosition,geometry和setGeometry的实现:

QPointF MyGraphicsRectItem::position()
{
    return QGraphicsRectItem::pos();
}

void MyGraphicsRectItem::setPosition(QPointF animPos)
{
     QGraphicsRectItem::setPos(animPos);
}

QRectF MyGraphicsRectItem::geometry()
{
    return rect();
}

void MyGraphicsRectItem::setGeometry(QRectF geo)
{
    setRect(geo);
}

编辑2

这是构造函数:

MyGraphicsRectItem::MyGraphicsRectItem(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent) :QGraphicsRectItem(x, y, width, height, parent) {
    setAcceptHoverEvents(true);
}

0 个答案:

没有答案