如今基本上也已经到了2D绘图部分的尾声,所谓重头戏都是在最后压轴的,如今咱们就要来看看在绘图部分功能最强大的Graphics View。咱们常常说KDE桌面,新版本的KDE桌面就是创建在Graphics View的基础之上,可见其强大之处。
Qt的白皮书里面这样写道:“Qt Graphics
View 提供了用于管理和交互大量定制的 2D 图形对象的平面以及可视化显示对象的视图 widget,并支持缩放和旋转功能。Graphics
View 使用 BSP(二进制空间划分)树形可很是快速地找到对象,所以即便是包含百万个对象的大型场景,也能实时图形化显示。”
Graphics View是一个基于item的M-V架构的框架。
基于item意思是,它的每个组件都是一个item。这是与QPainter的状态机不一样。回忆一下,使用QPainter绘图可能是采用一种面向过程的描述方式,首先使用drawLine()画一条直线,而后使用drawPolygon()画一个多边形;而对于Graphics View来讲,相同的过程能够是,首先建立一个场景scene,而后建立一个line对象和一个polygon对象,再使用scene的add()函数将line和polygon添加到scene,最后经过视口view就能够看到了。乍看起来,后者彷佛更加复杂,可是,若是你的图像中包含了成千上万的直线、多边形之类,管理这些对象要比管理QPainter的draw语句容易得多。而且,这些图形对象也更加符合面向对象的设计要求:一个很复杂的图形能够很方便的复用。
M-V架构的意思是,Graphics View提供一个model和一个view。所谓model就是咱们添加的种种对象,所谓view就是咱们观察这些对象的视口。同一个model能够由不少view从不一样的角度进行观察,这是很常见的需求。使用QPainter就很难实现这一点,这须要很复杂的计算,而Qt的Graphics View就能够很容易的实现。
Graphics View提供了一个QGraphicsScene做为场景,便是咱们添加图形的空间,至关于整个世界;一个QGraphicsView做为视口,也就是咱们观察的窗口,至关于照相机的取景框,这个取景框能够覆盖整个场景,也能够是场景的一部分;一些QGraphicsItem做为图形元件,以便scene添加,Qt内置了不少图形,好比line、polygon等,都是继承自QGraphicsItem。
下面咱们来看一下代码:

#include <QtGui>
class DrawApp :
public QWidget {
public:

DrawApp();
protected:
void paintEvent(QPaintEvent *
event);

};

DrawApp::DrawApp()

{

}
void DrawApp::paintEvent(QPaintEvent *
event)

{

QPainter painter(
this);

painter.drawLine(10, 10, 150, 300);

}
int main(
int argc,
char *argv[])

{

QApplication a(argc, argv);

QGraphicsScene *scene =
new QGraphicsScene;

scene->addLine(10, 10, 150, 300);

QGraphicsView *view =
new QGraphicsView(scene);

view->resize(500, 500);

view->setWindowTitle(
"Graphics View");

view->show();

DrawApp *da =
new DrawApp;

da->resize(500, 500);

da->setWindowTitle(
"QWidget");

da->show();
return a.exec();

}
为了突出重点,咱们就直接include了QtGui,不过在实际应用中不建议这么作。这里提供了直线的两种实现:一个是DrawApp使用咱们前面介绍的技术,重写paintEvent()函数,这里就不在赘述,重点来看main()函数里面的实现。
首先,咱们建立了一个QGraphicsScene做为场景,而后在scene中添加了一个直线,这样就把咱们须要的图形元件放到了scene中。而后建立一个QGraphicsView对象进行观察。就这样,咱们就是用Graphics View搭建了一个最简单的应用。运行这个程序来看结果:
第一张图是Graphics View的,第二个是DrawApp的。虽然这两个直线是一样的坐标,可是,DrawApp按照原始坐标绘制出了直线,而Graphics View则按照坐标绘制出直线以后,自动将直线居中显示在view视口。你能够经过拖动Graphics View来看直线是一直居中显示的。
这里仅仅是一个很简单的对比,不过你已经能够看到Graphics View功能的强大。仅这一个居中的操做,若是你是用QPainter,就须要很大的计算量了!固然,若是你不须要这种居中,Graphics View也是能够像QPainter绘制的同样进行显示的。