Qt绘图3--Graphic View Framework

这一部分的内容大都来自于Qt5.5.1的API文档
Graphic View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互。还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转。
这个框架包含了一个事件传播架构,对于场景上的items,它允许双精度的交互能力。Items可以处理键盘事件、鼠标的按下、移动、释放、双击等,还可以跟踪鼠标的移动。。Graphics View 使用了 BSP 树(Binary Space Partitioning tree,这是一种被广泛应用于图形学方面的数据结构)来提供非常快速的元素发现, 也正因为如此,才能够实现一种上百万数量级元素的实时显示机制。
Graphics View 是一个基于元素(item)的 MV 架构的框架。它可以分成三个部分:元素 item、 场景 scene 和视图 view。 它很像InterView的QTableView、QTreeView和QListView这样的便捷的类。许多view都可以看做是单场景的,而且这个场景包含着多种多样的几何图形的item. 基于元素意味着每个组件都是一个独立的元素,这与QPainter这样的面向过程的方式不同。QPainter是将要画的东西按顺序绘制出来,而Graphic View可以是先创建一个场景(scene),然后创建要绘制的对象,然后调用场景的add()函数添加。
MV 架构的意思是,Graphics View 提供一个 model 和一个 view(正如 MVC 架构,只不过 MV 架构少了 C 这么一个组件)。所谓模型(model)就是我们添加的种种对象;所谓视图(view) 就是我们观察这些对象的视口。同一个模型可以由很多视图从不同的角度进行观察,这是很常见 的需求。使用 QPainter 很难实现这一点,这需要很复杂的计算,而 Graphics View 可以很容易的实现。
Graphics View 提供了 QGraphicsScene 作为场景,即是允许我们添加图形的空间,相当于整个 世界;QGraphicsView 作为视口,也就是我们的观察窗口,相当于照相机的取景框,这个取景 框可以覆盖整个场景,也可以是场景的一部分;QGraphicsItem 作为图形元件,以便添加到场 景中去,Qt 内置了很多图形,比如直线、多边形等,它们都是继承自 QGraphicsItem。

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    scene.addLine(0,0,150,150);
    QGraphicsView view(&scene);
    view.setWindowTitle("Graphic View");
    view.show();
    return a.exec();
}

这个代码先创建了一个场景,然后添加了一条直线。然后创建了一个对此场景的一个Graphic View,运行后发现视图的中心正好就是直线的中点处。如果不想这样,可以用scene.setSceneRect()调整。。QGraphicsScene 的 sceneRect 属性供 QGraphicsView 确定视图默认的滚动条区域,并且协助 QGraphicsScene 管理元素索引。

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    scene.setSceneRect(0,0,300,300);
    scene.addLine(0,0,150,150);
    QGraphicsView view(&scene);
    view.setWindowTitle("Graphic View");
    view.show();
    return a.exec();
}

你可能感兴趣的:(qt5)