QT5图形视图框架
图形视图体系结构
GraphicsView (图形视图)框架结构取代了之前版本中的QCanvas模块,它提 供基于图元的模型/视图编程,类似于QtlnterView的模型/视图结构,只是这里的数据是图形。
GraphicsView 的特点
Graphics View框架结构的主要特点如下。
(1) Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL 工具来改善绘图性能。
(2) Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的 交互能力提高一倍,图元能够处理键盘事件和鼠标事件。其中,鼠标事件包括鼠标 按下、移动、释放和双击,还可以跟踪鼠标的移动。
(3 )在 Graphics View 框架中,通过二元空间划分树(Binary Space Partitioning, BSP)提供快速的图元查找,这样就能够实时地显示包含上百万个 图元的大场景。
Graphics View 的三元素
Graphics View框架结构主要包含三个类,场景类(QGraphicsScene)、视图类 (QGraphicsView)和图元类(QGraphicsItem),统称为"三元素”。其中,场景类提 供了一个用于管理位于其中的众多图元容器,视图类用于显示场景中的图元,一个 场景可以通过多个视图表现,一个场景包括多个几何图形。它们三者之间的关系如 图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvQt9T20-1664354665656)(C:\Users\star\Desktop\LearnC++\learn-c\QT应用开发\pic\GraphView三元素.png)]
(1)场景类:QGraphicsScene类
它是一个用于放置图元的容器,本身是不可见的,必须通过与之相连的视图类 来显示及与外界进行互操作。通过QGraphicsScene::addltem()可以添加一个图元到 场景中。图元可以通过多个函数进行检索。QGraphicsScene::items()和一些重载函数 可以返回和点、矩形、多边形或向量路径相交的所有图元。QGraphicsScene::itemAt() 返回指定点的最顶层图元。
场景类主要完成的工作包括,提供对它包含的图元的操作接口和传递事件,管 理各个图元的状态(如选择和焦点处理),提供无变换的绘制功能(如打印)等。
事件传播体系结构将场景事件发送给图元,同时也管理图元之间的事件传播。 如果场景接收到了在某一点的鼠标单击事件,场景会将事件传给在这一点的图元。
管理各个图元的状态(如选择和焦点处理)。可以通过 QGraphicsScene::setSelectionArea()函数选择图元,选择区域可以是任意的形状,使 用QPainterPath表示。若要得到当前选择的图元列表,则可以使用函数 QGraphicsScene::selectedltems()□可以通过 QGraphicsScene:: setFocusItem()函数或 QGraphicsScene::setFocus()函数来设置图元的焦点,获得当前具有焦点的图元使用 函数 QGraphicsScene::focusltem()。
如果需要将场景内容绘制到特定的绘图设备,则可以使用 QGraphicsScene: :render()函数在绘图设备上绘制场景。
(2) 视图类:QGraphicsView 类
它提供一个可视的窗口,用于显示场景中的图元。在同一个场景中可以有多个 视图,也可以为相同的数据集提供几种不同的视图。
QGraphicsView是可滚动的窗口部件,可以提供滚动条来浏览大的场景。如果 需要使用OpenGL ,则可以使用QGraphicsView::setViewport()将视图设置为 QGLWidgeto
视图接收键盘和鼠标的输入事件,并将它们翻译为场景事件(将坐标转换为场 景的坐标)。使用变换矩阵函数QGraphicsView::matrix()可以变换场景的坐标,实现 场景缩放和旋转。QGraphicsView 提供 QGraphicsView::mapToScene()和 QGraphicsView:: mapFromScene()用于与场景的坐标进行转换。
(3)图元类:QGraphicsItem 类
它是场景中各个图元的基类,在它的基础上可以继承出各种图元类,Qt已经预 置的包括直线(QGraphicsLineltem )、椭圆(QGraphicsEllipseltem )、文本图元 (QGraphicsTextltem)> 矩形(QGraphicsRectltem)等。当然,也可以在 QGraphicsItem 类的基础上实现自定义的图元类,即用户可以继承QGraphicsItem实现符合自己需 要的图元。
QGraphicsItem主要有以下几点功能。
•处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件。
•处理键盘输入事件。
•处理拖曳事件。
•分组。
•碰撞检测。
此外,图元有自己的坐标系统,也提供场景和图元。图元还可以通过 QGraphicsItem:: matrix()来进行自身的交换,可以包含子图元。
Graphics View 的坐标系统
1.场景坐标
场景坐标是所有图元的基础坐标系统。场景坐标系统描述了顶层的图元,每个 图元都有场景坐标和相应的包容框。场景坐标的原点在场景中心,坐标原点是X轴 正方向向右,y轴正方向向下。
2.视图坐标
视图坐标是窗口部件的坐标。视图坐标的单位是像素。QGraphicsView视图的 左上角是(0,0), X轴正方向向右,丫轴正方向向下。所有的鼠标事件最开始都是 使用视图坐标。
QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗 口的左上角作为自己坐标系的原点。
3.视图坐标
视图坐标是窗口部件的坐标。视图坐标的单位是像素。QGraphicsView视图的 左上角是(0,0), X轴正方向向右,丫轴正方向向下。所有的鼠标事件最开始都是 使用视图坐标。
QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗 口的左上角作为自己坐标系的原点。
根据需要,Qt提供了这三个坐标系之间的互相转换函数,以及图元与图元之间 的转换函数,若需从QGraphicsItem坐标系中的某一点坐标转换到场景中的坐标, 则可调用QGraphicsItem的mapToScene()函数进行映射。而QGraphicsItem的 mapToParent()函数则可将QGraphicsItem坐标系中的某点坐标映射至它的上一级坐 标系中,有可能是场景坐标,也有可能是另一个QGraphicsItem坐标。
Graphics View框架提供了多种坐标变换函数
映射函数 | 转换类型 |
QGraphicsView: :mapToScene() | 视图到场景 |
QGraphicsView: :mapFromScene() | 场景到视图 |
QGraphicsItem:: mapFromScene() | 场景到图元 |
QGraphicsItem:: mapToScene() | 图元到场景 |
QGraphicsItem:: mapToParent() | 子图元到父图元 |
QGraphicsItem:: mapFromParent() | 父图元到子图元 |
QGraphicsItem:: mapToItem() | 本图元到其他图元 |
QGraphicsItem:: mapFromItem() | 其他图元到本图元 |
QT日常专栏会使用一个例子详细介绍该模块。请关注QT日常专栏更新状态