1,Graphics View(图形视图);Graphics View框架结构主要包含三个类:场景类(QGraphicsScene)、QGraphicsView(视图类)、QGraphicsItem(图元类);场景类提供了一个用于管理位于其中的众多图元容器,视图类用于显示场景中的图元,一个场景可以通过多个视图表现,一个场景包括多个几何图形;总体来说QGraphicsScene由QGraphicsView构成,QGraphicsView由QGraphicsItem构成
2,源码:
#include "butterfly.h"
const static double PI=3.14116;
Butterfly::Butterfly(QObject *parent) : QObject(parent)
{
up = true; //给标志蝴蝶翅膀位置的变量赋初始化值
pix_up.load(":/image/up.png");
pix_down.load(":/image/down.png");
startTimer(100); //设定定时器时间间隔为100毫秒
}
//为图元限定区域范围,所有继承自QGraphicsItem的自定义图元都必须实现此函数
QRectF Butterfly::boundingRect() const
{
qreal adjust = 2; //qreal相当于float
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)
{
painter->drawPixmap(boundingRect().topLeft(), pix_up);
up = !up;
}
else
{
painter->drawPixmap(boundingRect().topLeft(), pix_down);
up = !up;
}
}
void Butterfly::timerEvent(QTimerEvent *event)
{
//边界控制
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)); //dx, dy完成蝴蝶随机飞行的路径,且dx dy是相对于蝴蝶的坐标系而言的
//因此应使用mapToParent()函数映射为场景的坐标
}
#include "mainwindow.h"
#include <QApplication>
#include <QGraphicsScene>
#include "butterfly.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
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->resize(400 , 400);
view->show();
return a.exec();
}
3,效果: