2016-09-11 4 views
0

以下のコードでグラフィックオブジェクトをアニメーション化しようとしています。両方のアニメーションは、2番目のアニメーションがコメント解除されている場合に機能します。また、2番目(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::setPosを起動しますので、

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

両方のアニメーションが一緒に仕事...それはあなたがあなたのset_radius実装でQGraphicsItem::updateの呼び出しを追加する必要があり、その場合には後者だと思います。

+0

聖杯。あなたが正しいです、私はアイテムを更新するのを忘れました。 – qloq

関連する問題