运行环境为Window XP
实验内容与分析设计
利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞实验步骤与调试过程
第一步:
Ctrl+N新建工程 其他项目---空的Qt项目 命名为butterfly
步骤二
Ctrl+N 新建选择 C++——C++源文件,命名为main.c
在mian.c中写入以下代码
#include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include "butterfly.h" int main(int argc, char * argv[]) { QApplication app(argc,argv); QGraphicsScene *scene = new QGraphicsScene; scene->setSceneRect(QRectF(-200,-200,400,400)); Butterfly *butterfly = new Butterfly; butterfly->setPos(-100,0); scene->addItem(butterfly); QGraphicsView *view = new QGraphicsView; view->setScene(scene); view->setMinimumSize(400,400); view->show(); return app.exec(); }
步骤三
Ctrl+N 新建选择 C++——C++类,类命名为butterfly基类写QObjecct或QDialog,生成两个文件一个是
butterfly.h butterfly.cpp
步骤四:
Ctrl+N 新建选择文件和类中的Qt---Qt资源文件。命名为butterfly生成文件:butterfly.qrc
并在butterfly中添加2张图片 分别命名为butterfly1.PNG butterfly2.PNG
步骤五:
分别在上边生成3个文件中添加代码(代码见下面---主要算法清单和程序清单),分别在.h .m中添加代码,运行之(源码已经在附件中附上)。
分别在.h .m中添加代码
//main.cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "butterfly.h"
int main(int argc, char * argv[])
{
QApplication app(argc,argv);
QGraphicsScene *scene = new QGraphicsScene;
scene->setSceneRect(QRectF(-200,-200,400,400));
Butterfly *butterfly = new Butterfly;
butterfly->setPos(-100,0);
scene->addItem(butterfly);
QGraphicsView *view = new QGraphicsView;
view->setScene(scene);
view->setMinimumSize(400,400);
view->show();
return app.exec();
}
//butterfly.cpp
#include "butterfly.h"
#include <QtGui>
#include <math.h>
static const double PI = 3.14159265358979323846264338327950288419717;
Butterfly::Butterfly()
{
pix_up.load(":/images/butterfly1.png");
pix_down.load(":/images/butterfly2.png");
up = true;
startTimer(100);
}
QRectF
Butterfly::boundingRect() const
{
qreal adjust = 2;
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)
{
if(up)
{
painter->drawPixmap(boundingRect().topLeft(),pix_up);
up = !up;
}
else
{
painter->drawPixmap(boundingRect().topLeft(),pix_down);
up = !up;
}
}
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));
}
//butterfly.h
#ifndef BUTTERFLY_H
#define BUTTERFLY_H
#include <QGraphicsItem>
#include <QObject>
class Butterfly : public QObject, public QGraphicsItem
{
Q_OBJECT
public:
Butterfly();
void timerEvent(QTimerEvent *);
QRectF boundingRect() const;
protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private:
bool up;
QPixmap pix_up;
QPixmap pix_down;
qreal angle;
};
#endif // BUTTERFLY_H
步骤六
Ctrl+R 运行即可。
实验结果
实现了一个利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞的预期效果。实验源代码已经上传,可运行观看。
实验注意事项:
对蝴蝶项目重画时,首先对up变量进行判断,确定当前已经显示的是pix_up图片还是pix_down图片,以此决定此次重画哪幅蝴蝶图片。