Qt会绘制复杂的可交互图形提供了Graphics View绘图架构,是一种基于图形项(Graphics Item)的模型/视图模式
使用Graphics View架构可以绘制复杂的几万个基本图形元件的图形,并且每个图形元件是可选择,可拖放和修改的
Graphics View架构由以下3个部分组成:场景、视图、图形项
1. 场景(Scene)
QGraphicsScene类提供绘图场景(Scene)。场景不可见,是一个抽象的管理图形项的容器,可以向场景添加图形项,获取场景中的某个图形项
1) 提供管理大量图形项的快速接口
2)将事件传播给每个图形项
3)管理每个图形项的状态,:选择状态 焦点
4)管理未经变换的渲染功能
场景还有背景层和前景层,通常由QBrush指定
2. 视图
QGraphicsView提供绘图的视图(View)组件,用于显示场景中的内容。可以为一个场景设置几个视图,用于对同一个数据集提供不同的视口
视图接收键盘和鼠标输入并转换为场景事件,并进行坐标转换后传送给可视场景
3. 图形项
Graphics Item : 基本图形元件, 基类:QGraphicsItem
如绘制椭圆的QGraphicsEclipseItem、绘制矩形的QGraphicsRectItem、绘制文字的QGraphicsTextItem等
支持鼠标事件响应 支持键盘输入、按键事件
支持拖放 支持组合,可以是父子项关系组合,通过QGraphicsItemGroup类进行组合
总结:场景是图形项的容器,可以在场景上绘制很多图形项,每个图形项就是一个对象,这些图形项可以被选择、拖动等。
视图是显示场景的一部分区域的视口,一个场景可以有多种视图
一个视图显示场景的部分区域或者全部区域,或从不同角度观察场景
4. Graphics View有3个有效的坐标系:图形项坐标、场景坐标、视图坐标
- 场景的坐标等价于 QPainter的逻辑坐标,一般以场景的中心为原点
- 视图坐标与设备坐标相同,是物理坐标,缺省以左上角为原点
- 图形项坐标是局部逻辑坐标,一般以图件的中心为原点
1)图形项坐标
使用自己的局部坐标(Item Coordinates),通常其中心为(0,0),各种坐标变换的中心
图形项的鼠标事件坐标是局部坐标表示,创建自定义图形项,绘制图形项时,只需要考虑其局部坐标。
QGraphicsScene 和 QGraphicsView 会自动进行坐标转换
一个图形项的位置是其中心点在父坐标系统中的坐标,对于没有父图形项的图形项,其父对象就是场景,图形项的位置就是在场景中的坐标。
如果一个图形项还是其他图形项的父项,父项进行坐标变换时,子项也做同样的坐标变换。
QGraphicsItem 的大多数函数都是在其局部坐标系上操作。
2)视图坐标
View Coordinates 就是窗口界面(widget)的物理坐标,单位是像素。
视图坐标只与widget或视图有关,与观察的场景无关。QGraphicsVIew视口的左上角坐标总是(0,0)
3) 场景坐标
(Screen Coordinates)场景是所有图形项的基础坐标,场景坐标描述了每个顶层图形项的位置,创建场景是可以定义场景矩形区的坐标范围
scene = new QGraphicsScene(-400,-300,800,600)
每个图形项在场景中都有一个位置坐标,由函数QGraphicsItem::scenePos()给出,还有一个图形项边界矩形,QGraphicsItem::sceneBoundingRect()
边界矩形可以使得QGraphicsScene直到场景中那个区域发生变化。
场景变化会发生 QGraphicsScene::changed()信号,参数是给场景的矩形列表
4) 坐标映射(Coordinate Mapping)
场景中操作图形项,进行场景到图形项、图形项到图形项,还有视图到场景之间的坐标变化
在QGraphicsView的视图上单击鼠标,通过QGraphicsView::mapToScene()视图坐标映射到场景坐标,用QGraphicsScene::itemAt()函数可以获取场景中鼠标光标出的图形项