Qt擁有一套面向動畫類,爲此,你必須首先創建從QGraphicsObject
繼承而來的對象,在這個類,你必須實現的方法paint
和boundingRect
。
ellipseobject.h
#ifndef ELLIPSEOBJECT_H
#define ELLIPSEOBJECT_H
#include <QGraphicsObject>
class EllipseObject : public QGraphicsObject
{
Q_OBJECT
public:
EllipseObject(QGraphicsItem * parent = 0);
void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0);
QRectF boundingRect() const;
};
#endif // ELLIPSEOBJECT_H
ellipseobject.cpp
#include "ellipseobject.h"
#include <QPainter>
EllipseObject::EllipseObject(QGraphicsItem *parent):QGraphicsObject(parent)
{
}
void EllipseObject::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option)
Q_UNUSED(widget)
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(QColor(0xaf, 0xaf, 0xaa));
painter->setBrush(QBrush(QColor(0xaf, 0xaf, 0xaa)));
QRectF rect = boundingRect();
painter->drawEllipse(rect);
}
QRectF EllipseObject::boundingRect() const
{
return QRectF(-4, -4, 8, 8);
}
然後我們可以使用QPropertyAnimation
類,與這一點,我們將動畫的位置。
EllipseObject *item = new EllipseObject;
QPropertyAnimation *animation = new QPropertyAnimation(item, "pos");
for(int j = 0; j < p; j++){
animation->setKeyValueAt(1.0*j/(p-1),
(r+ delta*sin(2*M_PI*j/p))*QPointF(qSin(2*M_PI*i/number_of_items), qCos(2*M_PI*i/number_of_items)));
}
animation->setDuration(2000);
因爲我們有並行的動畫幾個元素,我們可以用QParallelAnimationGroup
來處理每一個動畫。
group = new QParallelAnimationGroup(this);
[...]
group->addAnimation(animation);
如果我們想要連續,我們可以製作下面的代碼。
group->start();
connect(group, &QParallelAnimationGroup::finished,[=](){
group->start();
});
的完整源代碼here。
你可以顯示你已經與QPainter的實現代碼。 – eyllanesc
@eyllanesc我已添加代碼。我記得這段代碼,因爲我現在沒有可用的代碼。 – Croolman