动画和自定义 属性
Animation and custom property
我正在尝试在下面的代码中为图形对象设置动画。如果第二个动画未被注释,则两个动画都有效。第二个 (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);
}
当你说...
first animation (a1) doesn't work alone
你到底是什么意思?您的意思是您已经使用调试器单步执行了代码并且 set_radius 没有被调用——或者仅仅是您的 AItem
在屏幕上没有改变?我怀疑是后者,在这种情况下,您需要在 set_radius
实现中添加对 QGraphicsItem::update
的调用...
void AItem::setRadius (qreal r)
{
m_radius = r;
update();
}
两个动画一起工作,因为第二个动画将调用 QGraphicsItem::setPos
,这将自动触发所需的更新。
我正在尝试在下面的代码中为图形对象设置动画。如果第二个动画未被注释,则两个动画都有效。第二个 (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);
}
当你说...
first animation (a1) doesn't work alone
你到底是什么意思?您的意思是您已经使用调试器单步执行了代码并且 set_radius 没有被调用——或者仅仅是您的 AItem
在屏幕上没有改变?我怀疑是后者,在这种情况下,您需要在 set_radius
实现中添加对 QGraphicsItem::update
的调用...
void AItem::setRadius (qreal r)
{
m_radius = r;
update();
}
两个动画一起工作,因为第二个动画将调用 QGraphicsItem::setPos
,这将自动触发所需的更新。