Graphics View绘图架构(一)

时间:2024-03-04 19:45:19

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()函数可以获取场景中鼠标光标出的图形项