#include "butterfly.h"
#include <QtGui>
#include <QDebug>
#include <QtWidgets/QGraphicsScene>
#include <math.h>
static const double PI = 3.14159265358979323846264338327950288419717;
Butterfly::Butterfly()
{
setFlag(QGraphicsItem::ItemIsMovable);
pix_up.load(":/images/butterfly1.PNG");
pix_down.load(":/images/butterfly2.PNG");
up = true;
startTimer(100);
}
QRectF Butterfly::boundingRect() const
{
// boundingRect函数的作用是必须要重新实现的,因为他用来指定当前图形对象
// 每次重绘时需要刷新的区域,如果指定的的区域不正确,就会出现图片有些区
// 域没刷新的问题
qreal adjust = 8;
return QRectF(-pix_up.width()/2-adjust,-pix_up.height()/2-adjust,
pix_up.width()+adjust*2,pix_up.height()+2*adjust);
}
void Butterfly::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
// paint函数也必须要重新实现,顾名思义是用来绘制对象的具体内容的,每当update()被调用一次时,
// paint函数也会被调用一次
// 交替绘制两张蝴蝶照片,形成扇动翅膀的飞舞效果
if(up)
{
painter->drawPixmap(boundingRect().topLeft(),pix_up);
up = !up;
}
else
{
painter->drawPixmap(boundingRect().topLeft(),pix_down);
up = !up;
}
// 绘制一个圆
//painter->setPen(Qt::NoPen);
//painter->setBrush(Qt::darkGray);
//painter->drawEllipse(-7,-7,40,40);
//
//painter->setPen(QPen(Qt::black,0));
//painter->setBrush(Qt::red);
//painter->drawEllipse(-10,-10,40,40);
}
void Butterfly::timerEvent(QTimerEvent *)
{
// edge controll
qreal edgex = scene()->sceneRect().right()+boundingRect().width()/2;
qreal edgetop = scene()->sceneRect().top()+boundingRect().height()/2;
qreal edgebottom = scene()->sceneRect().bottom()+boundingRect().height()/2;
if (pos().x() >= edgex)
setPos(scene()->sceneRect().left(),pos().y());
if (pos().y() <= edgetop)
setPos(pos().x(),scene()->sceneRect().bottom());
if (pos().y() >= edgebottom)
setPos(pos().x(),scene()->sceneRect().top());
angle += (qrand()%10)/20.0;
qreal dx = fabs(sin(angle*PI)*10.0);
qreal dy = (qrand()%20)-10.0;
setPos(mapToParent(dx,dy));
update();
//qDebug() << scene()->itemsBoundingRect(); 输出到控制台
}