为Item应用属性动画
以下代码介绍了系统自带Item以及自定义Item的动画实现,注意使用QPropertyAnimation的类必须继承自QGraphicsObject
头文件(自定义Item):
#ifndef ITEMS_H
#define ITEMS_H
#include <QGraphicsObject>
class ColorFulCircle : public QGraphicsObject
{
//实现属性所用到的宏
Q_PROPERTY(QColor color MEMBER m_color READ color WRITE setColor NOTIFY colorChanged)
Q_OBJECT
public:
ColorFulCircle(QGraphicsItem *parent = 0);
ColorFulCircle(int w, int h, QColor color, QGraphicsItem *parent = 0);
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
signals:
void colorChanged();
public:
QColor color();
void setColor(QColor color);
protected:
int w, h;
QColor m_color;
};
#endif // ITEMS_H
其源文件:
#include "items.h"
#include <QPainter>
ColorFulCircle::ColorFulCircle(QGraphicsItem *parent)
:QGraphicsObject(parent) {}
ColorFulCircle::ColorFulCircle(int w, int h, QColor color, QGraphicsItem *parent)
:QGraphicsObject(parent), w(w), h(h), m_color(color) {}
QRectF ColorFulCircle::boundingRect() const {
return QRectF(0, 0, w, h);
}
void ColorFulCircle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
Q_UNUSED(option);
Q_UNUSED(widget);
painter->setRenderHint(QPainter::Antialiasing, true);
QRadialGradient radial(1.0*w/2, 1.0*h/2, 1.0*w/2, 1.0*w/2, 1.0*h/2);
radial.setColorAt(1, Qt::white);
radial.setColorAt(0, m_color);
painter->setPen(Qt::white);
painter->setBrush(radial);
painter->drawEllipse(0, 0, w, h);
}
QColor ColorFulCircle::color() {
return m_color;
}
void ColorFulCircle::setColor(QColor color) {
m_color = color;
update();
}
main:
#include <QtWidgets>
#include <QApplication>
#include "items.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(0, 0, 800, 800);
QGraphicsView view(&scene);
view.setFixedSize(1000, 1000);
view.setMaximumSize(1000, 1000);
view.setMinimumSize(1000, 1000);
QFont font = a.font();
font.setPointSize(20);
auto text = new QGraphicsTextItem("Hello");
text->setFont(font);
text->setPos(100, 100);
text->setZValue(1);
scene.addItem(text);
QPropertyAnimation anim(text, "pos");
anim.setDuration(5000);//设置动画周期
anim.setStartValue(QPointF(0, 0));
anim.setEndValue(QPointF(500, 500));
anim.setEasingCurve(QEasingCurve(QEasingCurve::OutCubic));//设置变换曲线
anim.setLoopCount(4);
anim.start();
QPropertyAnimation animRotate(text, "rotation");
animRotate.setDuration(5000);
animRotate.setStartValue(0);
animRotate.setEndValue(360);
animRotate.setLoopCount(4);
anim.setEasingCurve(QEasingCurve(QEasingCurve::InCurve));
animRotate.start();
//自定义Item
auto cc = new ColorFulCircle(100, 100, Qt::red);
cc->setPos(500, 500);
scene.addItem(cc);
QPropertyAnimation ccAnim(cc, "pos");
ccAnim.setDuration(5000);
ccAnim.setStartValue(QPointF(500, 500));
ccAnim.setEndValue(QPointF(0, 0));
ccAnim.setLoopCount(4);
ccAnim.start();
QPropertyAnimation ccAnimColor(cc, "color");
ccAnimColor.setDuration(5000);
ccAnimColor.setStartValue(QColor(Qt::red));
ccAnimColor.setEndValue(QColor(Qt::yellow));
ccAnimColor.setLoopCount(4);
ccAnimColor.start();
view.show();
return a.exec();
}