找回密码
 立即注册
查看: 161|回复: 0

Graphics View

[复制链接]
发表于 2023-1-4 13:36 | 显示全部楼层 |阅读模式
最近需要实现一个可视化拖拽工具,需要使用到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)。



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

[Scene(QGraphicsScene)]
QGraphicsScene类被设计用于实现如下职责:

  • 提供一个快速管理大量图形项的接口
  • 为每一个图形项传播其触发的事件
  • 管理图形项状态:例如选中、焦点处理
  • 提供未转换的渲染功能;主要用于打印
场景用作图形项的容器,通过调用addItem()将图形项添加到场景中,通过调用各种图形项扫描函数来检索场景中包含哪些图形项。例如items()及其重载函数可以返回一个点、矩形或多边形区域中包含的图形项,itemAt()返回一个点处最顶层的图形项,这些函数都以降序顺序返回图形项(即第一个返回的是最顶层,最后一个是底层)
QGraphicsScene的事件传播体系通过调度场景事件向图形项传递事件,并管理图形项之间的事件传播。如果场景在某个位置接收到鼠标按下事件,则场景会将事件传递到该位置的所有图形项
QGraphicsScene还管理某些图形项状态,例如选中图形项和焦点处理。您可以通过调用setSelectionArea()选中该区域内的图形项,该功能可作为框选的基础,通过调用selectedItems()获取到所选的图形项;管理的另一个状态是图形项是否具有键盘输入焦点,可以通过调用setFocusItem()或setFocus()来设置图形项的焦点,或者通过调用focusItem()来获取当前焦点项。
最后,QGraphicsScene允许通过render()函数将场景的一部分渲染到绘图设备中。
[View(QGraphicsView)]
QGraphicsView提供了视图小部件,用于可视化场景中的内容。可以将多个视图附加到同一场景,视图小部件是一个滚动区域,提供了用于在大型场景中导航的滚动条。可以通过调用setViewport()将QGLWidget设置为视图窗口来启用OpenGL支持。
视图从键盘和鼠标接收输入事件,并将其转换为场景事件(在适当的情况下将视图坐标转换为场景坐标),然后将事件发送到场景中。
通过调用transform(),视图可以变换场景的坐标系。从而实现一些高级导航功能,如缩放和旋转等,mapToScene()、mapFromScene()等函数可以在视图坐标系与场景坐标系之间进行转换。
[Item(QGraphicsIitem)]
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中的坐标系统:视图、场景、图形项的坐标系统如何构成,如何相互转换

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 13:02 , Processed in 0.089473 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表