您的位置:首页 > 编程语言 > Qt开发

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

2015-01-25 18:25 399 查看

实现一个飞舞的蝴蝶

1、大体框架

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

这个是主函数main.cpp

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

#include "butterfly.h"

#include <QApplication>
#include <QGraphicsScene>   //图形场景
#include <QGraphicsView>
#include <QDebug>

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 <QObject>
#include <QGraphicsItem>    //图片元
#include <QGraphicsView>  //视图显示
#include <QPainter>
#include <QGraphicsScene>
#include <QDebug>

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 <QtGui>
#include <math.h>   //使用一些乱七八糟的数学公式,什么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盘下面

结果:









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: