2016-09-11 2 views
0

Я пытаюсь анимацию графического объекта в коде ниже. Обе анимации работают, если второй раскоментирован. Также вторая анимация (a2) работает сама по себе, но первая анимация (a1) не работает сама по себе. В чем проблема?Анимация и обычное свойство

// aitem.h 
#ifndef AITEM_H 
#define AITEM_H 

#include <QObject> 
#include <QGraphicsItem> 
#include <QGraphicsObject> 
#include <QPainter> 
#include <QPropertyAnimation> 

class AItem : public QGraphicsObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(qreal radius READ radius WRITE setRadius) 

public: 
    AItem(QGraphicsItem *parent = 0); 
    ~AItem(); 

    qreal radius() const { return m_radius; } 
    void setRadius (qreal r) { m_radius = r; } 

    QRectF boundingRect() const; 
    void paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 

private: 
    QPropertyAnimation* a1; 
    QPropertyAnimation* a2; 
    qreal m_radius; 

}; 

#endif // AITEM_H 

// aitem.cpp 
#include "aitem.h" 

AItem::AItem(QGraphicsItem *parent): QGraphicsObject(parent), m_radius(10) 
{ 
    a1 = new QPropertyAnimation (this, "radius"); 
    a1->setDuration(5000); 
    a1->setStartValue(10); 
    a1->setEndValue(150); 
    a1->start(); 

    /* 
    a2 = new QPropertyAnimation (this, "pos"); 
    a2->setDuration(5000); 
    a2->setStartValue(QPointF(0, 0)); 
    a2->setEndValue(QPointF(300, 300)); 
    a2->start(); 
    */ 
} 

AItem::~AItem() 
{ 
} 

QRectF AItem::boundingRect() const 
{ 
    return QRectF (0, 0, m_radius, m_radius); 
} 

void AItem::paint(QPainter *painter, const QStyleOptionGraphicsItem  *option, QWidget *widget) 
{ 
    painter->drawRect(0, 0, m_radius, m_radius); 
} 

ответ

0

Когда вы говорите ...

первая анимация (a1) не работает в одиночку

что именно вы имеете в виду? Вы имеете в виду, что вы прошли через код с помощью отладчика, а set_radius не вызвали - или просто, что ваш AItem не изменился на экране? Я подозреваю, что это последний в этом случае вам нужно добавить вызов QGraphicsItem::update в вашем set_radius реализации ...

void AItem::setRadius (qreal r) 
{ 
    m_radius = r; 
    update(); 
} 

Обе анимации работают вместе, потому что второй будет вызывать QGraphicsItem::setPos, который будет автоматически вызвать требуемое обновление.

+0

Святой Грааль. Вы правы, я забыл обновить элемент. – qloq

Смежные вопросы