QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞

时间:2023-02-03 20:40:11

运行环境为Window XP

利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞


实验内容与分析设计

利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞



实验步骤与调试过程



第一步:
    Ctrl+N新建工程  其他项目---空的Qt项目   命名为butterfly
QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞
QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞

步骤二
    Ctrl+N  新建选择  C++——C++源文件,命名为main.c

QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞
   QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞

 在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

QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞


QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞


 

    
步骤五:
    分别在上边生成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与定时器实现动画效果:蝴蝶飞舞的预期效果。 

    实验源代码已经上传,可运行观看。 


http://vdisk.weibo.com/s/j_SXx/1354974972


实验注意事项:

对蝴蝶项目重画时,首先对up变量进行判断,确定当前已经显示的是pix_up图片还是pix_down图片,以此决定此次重画哪幅蝴蝶图片。