【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盘下面
结果:
相关文章推荐
- 【Qt5开发及实例】13、实现一个简单的文本编辑器2
- 【Qt5开发及实例】15、实现一个简单的文本编辑器4
- 【Qt5开发及实例】14、实现一个简单的文本编辑器3
- 【Qt5开发及实例】16、实现一个简单的文本编辑器(over)
- 【Qt5开发及实例】12、实现一个简单的文本编辑器1
- 【Qt5开发及实例】17、一个对话框的坐标参数显示
- 【Qt5开发及实例】30、实现客户端的编程,UDP协议
- iOS开发中实现一个简单的图片浏览器的实例讲解
- QGraphic view实例:利用QGraphicsItem与定时器实现动画效果:蝴蝶飞舞
- C语言模块化开发简单实例——实现一个计算器的加减乘除
- 【Qt5开发及实例】35、实现单元测试
- 【Qt5开发及实例】25、实现代理的功能
- WPF和Expression Blend开发实例:充分利用Blend实现一个探照灯的效果
- 【Qt5开发及实例】32、实现键盘的监控操作
- 一个用Winform进行业务定制二次开发实现实例
- Qt5主窗体程序: 文本编辑器的实现(Qt5开发及实例)
- 【Qt5开发及实例】29、实现服务器端的编程,UDP协议
- 【Qt5开发及实例】19、一个简单的画图程序
- 【Qt5开发及实例】9、一个QQ界面
- WPF和Expression Blend开发实例:一个样式实现的数字输入框