【Qt5开发及实例】20、实现一个飞舞的蝴蝶

实现一个飞舞的蝴蝶

 

1、大体框架

首先创建一个场景,然后把图片元加入到这个场景中去,最后我们再创建一个显示层,把设置一下场景和图片元,拿来显示

 这个是主函数main.cpp

/**
* 书本:【Qt5开发及实例】
* 功能:实现一个飞舞的蝴蝶
* 文件:main.cpp
* 时间:2015年1月25日13:29:29
* 作者:cutter_point
*/

#include "butterfly.h"

#include 
#include    //图形场景
#include 
#include 

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  //首先我们创建一个场景作为基础
  QGraphicsScene *scene = new QGraphicsScene;   //创建一个场景
  scene->setSceneRect(QRectF(-400, -300, 500, 500));    //前面两个是坐标,后面两个是长和宽,设置场景的大小

  //这里我们就要创建自己的图片元了
  Butterfly *butterfly = new Butterfly;
  butterfly->setPos(-100, 0);     //设置图片元起始的位置

  //把蝴蝶加到场景里面去
  scene->addItem(butterfly);
//  qDebug()<<"????1111";

  QGraphicsView *view = new QGraphicsView;    //视图显示
  view->setScene(scene);    //设置场景

//  qDebug()<<"????222222";

  view->resize(500, 500);   //设置视图大小
  view->show();

//  qDebug()<<"????333333";

  return a.exec();
}


 

 

2、图片元的具体实现


/**
* 书本:【Qt5开发及实例】
* 功能:实现一个飞舞的蝴蝶
* 文件:butterfly.h
* 时间:2015年1月25日13:29:29
* 作者:cutter_point
*/
#ifndef BUTTERFLY_H
#define BUTTERFLY_H

#include 
#include     //图片元
#include   //视图显示
#include 
#include 
#include 

class Butterfly : public QObject, public QGraphicsItem    //图片元
{
  Q_OBJECT

public:
  explicit Butterfly();
  //这里有个函数,只要继承了QGraphicsItem就必须实现
  QRectF boundingRect() const;    //设置自定义的图片元的范围
  void timerEvent(QTimerEvent *);

signals:

public slots:

protected:
  //还有一个抽象函数必须要实现,因为继承自QGraphicsItem
  // virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) = 0;
  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);   //重绘函数

private:
  bool up;    //蝴蝶的两种动作,上和下
  QPixmap pix_up;   //表示两幅蝴蝶的图片
  QPixmap pix_down;

  //蝴蝶飞舞的方向改变
  qreal angle;

};

#endif // BUTTERFLY_H


 

这个只是初步的后面需要的话,还会继续加

 

这个是定义文件

 

/**
* 书本:【Qt5开发及实例】
* 功能:实现一个飞舞的蝴蝶
* 文件:butterfly.cpp
* 时间:2015年1月25日13:29:29
* 作者:cutter_point
*/
#include "butterfly.h"

#include 
#include    //使用一些乱七八糟的数学公式,什么sin啊什么fabs啊。。。

//π就是3.1415026
const static double PI = 3.1416;

Butterfly::Butterfly()
{
  bool b;
  //首先我们把蝴蝶的开始是翅膀向上
  up = true;
  //加载图片
  b = pix_up.load("F:\\up.png");
//  if(b)
//    {
//      qDebug()<<"????";
//    }
//   paintArea->setBrush(QBrush(QPixmap(":/butterfly.png")));
  pix_down.load("F:\\down.png");
  //设置一个变化重画的时间间隔
  startTimer(100);    //1000毫秒

}

//设定图片元的大小范围
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() + adjust * 2);
}

//然后实现重绘事件
void Butterfly::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
  //判定是重绘翅膀向上还是向下
  if(up)
    {
      //向上
//      if(pix_up.isNull())
//        {
//          qDebug()<<"111111111";
//        }

      painter->drawPixmap(boundingRect().topLeft(), pix_up);
//      qDebug()<<"222222222";
      up = !up;
    }
  else
    {
      painter->drawPixmap(boundingRect().topLeft(), pix_down);
      up = !up;
    }
}

void Butterfly::timerEvent(QTimerEvent *)
{

  //边界控制
  qreal edgex=scene()->sceneRect().right()+boundingRect().width()/2;
//  qDebug()<<">???????11111222222 ";
  qreal edgetop=scene()->sceneRect().top()+boundingRect().height()/2;
//    qDebug()<<">???????111113333333";
  qreal edgebottom=scene()->sceneRect().bottom()+boundingRect(). height()/2;

//    qDebug()<<">???????2222";

  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());

//    qDebug()<<">???????33333";

  angle+=(qrand()%10)/20.0;
  qreal dx=fabs(sin(angle*PI)*10.0);
  qreal dy=(qrand()%20)-10.0;



  setPos(mapToParent(dx,dy));
//  update();
}


 

1、出现问题,就是图画显示不出来??

 

原因是图片读取失败!

 

  b=pix_up.load("F:\\up.png");

//  if(b)

//    {

//      qDebug()<<"????";

//    }

//   paintArea->setBrush(QBrush(QPixmap(":/butterfly.png")));

  pix_down.load(":/down.png");

 

上面的那个成功,下面那个失败,而且上面那个路径过长的时候也会失败!!!!



最后的解决办法是改成上面程序那样只,都用

pix_up.load("F:\\up.png");
pix_down.load("F:\\down.png");

并且把相应的up.png和down.png拷贝到F盘下面


结果:

【Qt5开发及实例】20、实现一个飞舞的蝴蝶_第1张图片


【Qt5开发及实例】20、实现一个飞舞的蝴蝶_第2张图片【Qt5开发及实例】20、实现一个飞舞的蝴蝶_第3张图片【Qt5开发及实例】20、实现一个飞舞的蝴蝶_第4张图片【Qt5开发及实例】20、实现一个飞舞的蝴蝶_第5张图片




你可能感兴趣的:(Qt5开发及实例)