一.场景(QGraphicsScene)
QGraphicsScene 提供了图形视图框架的场景,相当于一块画布,并具有以下功能。
1.一个管理大量图形项的快速接口。
2.向每个图形项传播事件
3.管理图形项的状态,比如选择,焦点处理等
4.提供无转换的渲染功能,主要用于打印
简单地一个场景使用
1 QGraphicsScene scene;//场景
2 scene.addText("Hello, world!");//添加文本图形项
3 QGraphicsView view(&scene);//设置视图
4 view.show();
1 addText("Hello, world!") 相当于执行了以下两句
2
3 QGraphicsTextItem *item = new QGraphicsTextItem("Hello, world!");
4 scene.addItem(item);
如果场景要删除一个图形项,可以使用
removeItem(item)
函数。
一般而言,场景层从下到上共分为3层,分别为背景层(backgroundLayer), 图形项层(Itemlayer)与前景层(ForegroundLayer)。场景绘制总是从背景层开始,然后是图形层,最后是前景层。
1 scene.setForegroundBrush(QColor(255,255,255,100));//前景层颜色为白色半透明
2 scene.setBackgroundBrush(Qt::green);//背景色设置为绿色
对于前景层,我们一般不进行设置,或者像上面这样设置为半透明的白色。对于背景层,这里设置为了绿色,当然,我们也可以将一张图片设置为背景。
scene.setBackgroundBrush(QPixmap(":/background.jpg"));
2. 场景边界矩形
场景大小默认是没有限制的,图形项可以放到场景的任何位置。而场景的边界矩形仅用于场景内部进行索引的维护。
因为如果没有边界矩形,场景就要搜索所有的图形项,然后确定出其边界,这是十分费时的。所以如果要操作一个较大的场景,我们应该给出它的边界矩形。设置边界矩形,可以使用setSceneRect()函数。
3.图形项查找
场景最大的优势之一就是可以快速的锁定图形项的位置,即使有上百万个图形项,items()函数也能在数毫秒的时间内锁定一个图形项的位置。items()函数有几个重载函数来方便的进行图形项的查找。但是有时在场景的一个点可能重叠着几个图形项,这时我们可以使用itemAt()函数返回最上面的一个图形项。对于这些函数的使用,我们到后面讲视图时再举例讲解。
4.事件处理和传播
场景可以传播来自视图的事件,将事件传播给该点最顶层的图形项。但是就像我们在讲图形项时所说的那样,如果一个图形项要接收键盘事件,那么它必须获得焦点。而且,如果我们在场景中重写了事件处理函数,那么在该函数的最后,必须调用场景默认的事件处理函数,只有这样,图形项才能接收到该事件。这一点我们也到后面讲视图时再细讲。
二.视图(QGraphicsView)
QGraphicsView 提供了视图窗口部件,它使场景的内容可视化。你可以给一个场景关联多个视图,从而给一个数据集提供多个视口。视图部件是一个滚动区域,就是说,它可以提供一个滚动条来显示大型的场景。如果要使用OpenGL,你可以使用QGraphicsView::setViewport()函数来添加QGLWidget 。
(一)缩放与旋转
1 QGraphicsView::scale(xScale, yScale);//在分别在x,y方向上缩放xScale,yScale倍。若为1.0倍,则不进行缩放。
2 QGraphicsView::rotate(90);//顺时针旋转90度
setAlignment(Qt::AlignLeft | Qt::AlignTop);
1 QGraphicsView::NoDrag :忽略鼠标事件,不可以拖动。 2 QGraphicsView::ScrollHandDrag :光标变为手型,可以拖动场景进行移动。 3 QGraphicsView::RubberBandDrag :使用橡皮筋效果,进行区域选择,可以选中一个区域内的所有图形项。
setDragMode(QGraphicsView::ScrollHandDrag);//手型拖动
scene->setSceneRect(0,0,800,800);
QGraphicsView::mousePressEvent(event);
QGraphicsView::mousePressEvent(event);
QGraphicsScene::keyPressEvent(event);
setCacheMode(QGraphicsView::CacheBackground);
QT += opengl
#include <QtOpenGL>
1 QGLWidget *widget =new QGLWidget(this);
2 setViewport(widget);
1 void MyView::mousePressEvent(QMouseEvent*event)
2 {
3 rotate(90); //视图旋转顺时针90度
4 QPixmap pixmap(400,400); //必须指定大小
5 QPainter painter(&pixmap);
6 render(&painter,QRectF(0,0,400,400),QRect(0,0,400,400)); //打印视图指定区域内容
7 pixmap.save("../graphicsView04/save.png");
8 QGraphicsView::mousePressEvent(event);
9 }
scene()->render(&painter,QRectF(0,0,400,400),QRect(0,0,400,400));//打印场景内容