一、基本知识
1、图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元。
框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)进行精确的双精度交互功能。图元可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也能跟踪鼠标移动。
架构:一个场景,多个图元位于其中,通过视图显示
图形视图使用一个BSP(Binary Space Partitioning - 二叉空间分割)树,以提供对图形元素的快速查找,正因为如此,它可以使超大的场景实时地可视化,即使包含数百万的图元。
图形视图框架是按照MVC设计模式绘图, MVC设计模式包括三个元素:数据的模型(Model),用户界面的视图(View) ,用户再界面上的操作控制Controller。
主要应用: 绘图软件,显示地图软件
2、图形视图架构
图形视图提供了一个基于图元的方式来实现模型视图(model-view)编程,很像InterView中的便利类:QTableView、QTreeView和QListView。多个视图可以观察一个单独的场景,场景则包含了不同的几何形状图元 。
(1)Graphics View的特点
QGraphicsView 是为了在场景上显示图元而提供的类。QGraphicsView包括可视控件区域和用于显示大场景滚动区域,可以接受用户输入事件。QGraphicsView间接继承至QWidget。
- 框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。
- 支持事件传播体系结构,可以使用图元在场景中的交互能力提高一倍,图元能够处理鼠标事件和键盘事件。
- 通过二元空间划分树(BSP)提供快速的图元查找。
(2)Graphics View的三要素
场景类、视图类、图元类统称为三要素
1)场景类(QGraphicsScene)
它是一个用于放置图元的容器,本身是不可见的,必须通过与之相连的视图类来显示及与进行互操作。
场景类的主要工作包括提供对它包含的图元的操作结构和传递事件、管理各个图元的状态(如选择和焦点处理)、提供无变换的绘制功能(如打印)。
- 事件传播体系结构将场景事件发送给图元,同时也管理图元之间的事件传播。如果场景接收到了在某一个点的鼠标单击事件,场景会将事件传递给这一点的图元。
- 一个场景分为三个层:图形项层(
ItemLayer
)、前景层(ForegroundLayer
)和背景层(BackgroundLayer
)。场景的绘制总是从背景层开始,然后是图形项层,最后是前景层。
2)视图类:QGraphicsView类
它提供了一个可视的窗口,用于显示场景中的图元。在同一个场景中可以有多个视图,也可以为相同的数据集提供几种不同的视图。
QGraphicsScene类可以保存图元,也可以处理用户输入事件。是图形对象QGraphicsItem的容器,为管理大量的items提供一个快速的接口。QGraphicsScene只继承自QObject,所以本身是不可见的,必须通过与之相连的视图类QGraphicsView来显示.
3)图元类:QGraphicsItem类
它是场景中各个图元的基类,在它的基础上可以继承出各种图元类。
QGraphicsItem是为了在图形视图上实现图形对象而提供的类。支持鼠标、键盘、焦点事件,支持拖放,在它的基础上可以继承出各种图元类。
3、Graphics View的坐标系
Graphics View的基本类中有各自不同的坐标系,场景坐标系、视图坐标系和图元坐标系。
1)场景坐标系:
是所有图元的基础坐标系,场景坐标系描述了顶层的图元,每个图元都有场景坐标和相应的包容框。场景坐标的原点在场景的中心,坐标原点是x轴正方向向右,y轴正方向向下。
2)视图坐标
视图坐标是窗口部件的坐标,视图坐标的单位是像素,视图的左上角是(0,0),x轴正方向向右,y轴正方向向下。
3)图元坐标
图元使用自己的本地坐标,这个坐标系通常以图元的中心为原点,这也是所有变换的原点。图元的坐标方向是x轴正方向向右,y轴正方向向下。
4、坐标系映射
父子图元坐标映射:
QGraphicsItem::mapToParent //子图元坐标映射到父图元
QGraphicsItem::mapFromParent //父图元坐标映射到子图元
图元与场景坐标映射:
QGraphicsItem::mapToScene //图元到场景
QGraphicsItem::mapFromScene //场景到图元
场景与视图坐标映射:
QGraphicsView::mapFromScene //场景到视图
QGraphicsView::mapToScene //视图到场景