c0d3n4m 发表于 2023-1-4 13:36

Graphics View

最近需要实现一个可视化拖拽工具,需要使用到Graphics View框架,发现Graphics View相关的文章都比较零散,因此决定将自己最近的学习进行总结记录
首先第一步,看看QT的官方文档
QT文档

Graphics View Framework
Graphics View 提供了一个界面,用于对大量的自定义2D图形项(Item)进行管理与交互,可视化其中的图形项,支持旋转与缩放。该框架包括一个事件传播架构,从而允许对场景中的图形项进行精确的交互(double:含义目前未知)。使图形项可以对按键事件、鼠标按下、移动、释放和双击事件等进行处理,还可以跟踪鼠标移动。
Graphics View使用BSP(二进制空间分区)树来对图形项进行快速检索,因此可以实时的对大型场景进行可视化,即使有数百万个图形项。
那么,Graphics View如何进行图形项的管理、交互以及事件传播呢,接着往下看The Graphics View Architecture
Graphics View 提供了一种基于图形项的模型-视图编程方法,很像InterView中的QTableView、QTreeView、QListView。多个视图(View)可以观察单个场景(Scene),场景可以包含不同几何形状的图形项(Item)。



上述视图-场景-图形项的模式不就类似于使用望远镜看风景吗,哈哈,视图就是我们手中的望远镜,可以调节看哪个区域,调节倍数等,场景就对应外部世界,图形项对应一个个物体,图片来自于百度


QGraphicsScene类被设计用于实现如下职责:

[*]提供一个快速管理大量图形项的接口
[*]为每一个图形项传播其触发的事件
[*]管理图形项状态:例如选中、焦点处理
[*]提供未转换的渲染功能;主要用于打印
场景用作图形项的容器,通过调用addItem()将图形项添加到场景中,通过调用各种图形项扫描函数来检索场景中包含哪些图形项。例如items()及其重载函数可以返回一个点、矩形或多边形区域中包含的图形项,itemAt()返回一个点处最顶层的图形项,这些函数都以降序顺序返回图形项(即第一个返回的是最顶层,最后一个是底层)
QGraphicsScene的事件传播体系通过调度场景事件向图形项传递事件,并管理图形项之间的事件传播。如果场景在某个位置接收到鼠标按下事件,则场景会将事件传递到该位置的所有图形项。
QGraphicsScene还管理某些图形项状态,例如选中图形项和焦点处理。您可以通过调用setSelectionArea()选中该区域内的图形项,该功能可作为框选的基础,通过调用selectedItems()获取到所选的图形项;管理的另一个状态是图形项是否具有键盘输入焦点,可以通过调用setFocusItem()或setFocus()来设置图形项的焦点,或者通过调用focusItem()来获取当前焦点项。
最后,QGraphicsScene允许通过render()函数将场景的一部分渲染到绘图设备中。

QGraphicsView提供了视图小部件,用于可视化场景中的内容。可以将多个视图附加到同一场景,视图小部件是一个滚动区域,提供了用于在大型场景中导航的滚动条。可以通过调用setViewport()将QGLWidget设置为视图窗口来启用OpenGL支持。
视图从键盘和鼠标接收输入事件,并将其转换为场景事件(在适当的情况下将视图坐标转换为场景坐标),然后将事件发送到场景中。
通过调用transform(),视图可以变换场景的坐标系。从而实现一些高级导航功能,如缩放和旋转等,mapToScene()、mapFromScene()等函数可以在视图坐标系与场景坐标系之间进行转换。

QGraphicsItem是所有图形项的基类,Graphics View本身也提供了一些标准图形项,如矩形、椭圆、文本等,但想要实现丰富的功能时需要自己实现一个定制化的图形项。QGraphicsItem支持以下功能:

[*]鼠标按下、移动、释放、双击、悬停、滚轮等事件的处理
[*]键盘输入焦点和按键事件
[*]拖放
[*]通过父子关系和QGraphicsItemGroup进行分组
[*]碰撞检测
图形项位于本地坐标系中,与QGraphicsView一样,它还提供了许多函数用于在图形项与场景,图形项之间映射坐标。此外,与QGraphicsView一样,它可以使用矩阵transform()转换其坐标系。这对于旋转和缩放单个图形项非常有用。
图形项可以包含其他图形项(子项)。父项的转换由其所有子项继承。然而,不管图形项的转换如何累积,它的所有函数(例如,contains()、boundRect()和collesWith()仍然在局部坐标中进行操作。
图形项通过shape()函数和collesWith()函数支持碰撞检测,这两个函数都是虚函数。通过从shape()返回图形项的形状(QPainterPath)作为局部坐标,QGraphicsItem将为您处理所有碰撞检测。但是,如果您想提供自己的碰撞检测,可以重新实现collesWith()函数。
到此,Graphics View Framework的简要介绍以及完成
以下类提供了一个框架用于创建交互式应用程序
类名作用QAbstractGraphicsShapeItemShape公共基类QGraphicsAnchor表示QGraphicsAnchorLayout中两个图形项之间的锚点QGraphicsAnchorLayout可以在图形视图中将小部件锚定在一起的布局QGraphicsEffect所有图形效果类的基类QGraphicsEllipseItem椭圆图形项QGraphicsGridLayout用于在图形视图中管理小部件的网格布局QGraphicsItem所有图形项的基类QGraphicsItemGroup将一组图形项视为单个图形项的容器QGraphicsLayout图形视图中所有布局的基类QGraphicsLayoutItem可以继承以允许通过布局管理自定义项QGraphicsLineItem直线图形项QGraphicsLinearLayout用于在图形视图中管理小部件的水平或垂直布局QGraphicsObject需要信号、槽和属性的所有图形项的基类QGraphicsPathItemPath图形项QGraphicsPixmapItemPixmap图形项QGraphicsPolygonItem多边形图形项QGraphicsProxyWidget用于在QGraphicsScene中嵌入QWidget的代理层QGraphicsRectItem矩形图形项QGraphicsScene用于管理大量二维图形项的接口QGraphicsSceneContextMenuEvent图形视图框架中的上下文菜单事件QGraphicsSceneDragDropEvent图形视图框架中的拖放事件QGraphicsSceneEvent所有图形视图框架事件的基类QGraphicsSceneHelpEvent请求工具提示时的事件QGraphicsSceneHoverEvent图形视图框架中的悬停事件QGraphicsSceneMouseEvent图形视图框架中的鼠标事件QGraphicsSceneMoveEvent在图形视图框架中移动小部件的事件QGraphicsSceneResizeEvent在图形视图框架中调整小部件大小的事件QGraphicsSceneWheelEvent图形视图框架中的滚轮事件QGraphicsSimpleTextItem简单文本图形项QGraphicsSvgItemSVG文件图形项QGraphicsTextItem文本图形项QGraphicsTransform用于在QGraphicsItems上构建高级转换的抽象基类QGraphicsView用于显示QGraphicsScene内容的小部件QGraphicsWidgetQGraphicsScene中所有小部件项的基类QStyleOptionGraphicsItem用于描述绘制QGraphicsItem所需的参数下一篇文章介绍Graphics View中的坐标系统:视图、场景、图形项的坐标系统如何构成,如何相互转换
页: [1]
查看完整版本: Graphics View