首先创建一个场景,然后把图片元加入到这个场景中去,最后我们再创建一个显示层,把设置一下场景和图片元,拿来显示
/**
* 书本:【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();
}
/**
* 书本:【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();
}
原因是图片读取失败!
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");
结果: