分享Qt 之 Graphics View Framework 简介内容

Graphics View Framework是Qt中用于2D图形交互的框架,支持大规模图元管理、缩放和旋转功能。它包括事件传播机制,允许高精度双精度交互。框架利用BSP树提供快速图元查找,适用于实时展示大型场景。QGraphicsScene作为管理图元的容器,而QGraphicsView用于可视化。两者结合,实现了基于项目的模型-视图编程,允许多个视图查看单个场景。QGraphicsItem作为图形项基类,支持自定义形状、碰撞检测、变换和事件处理,提供灵活的2D图形编程能力。
摘要由CSDN通过智能技术生成

Graphics View Framework

交互式 2D 图形的 Graphics View 框架概述。自 Qt4.2 中引入了 Graphics View,以取代其前身 QCanvas。Graphics View 提供了一个用于管理和交互大量的可定制的 2D 图形项与用于可视化这些项的 View 小部件的 surface(曲面),并提供缩放(zooming)和旋转(rotation)功能支持。

该框架包括事件传播体系结构(an event propagation architecture),该体系结构允许对场景中的项目进行精确的双精度交互功能。图元可以被如下操作处理:按键事件,鼠标按下,移动,释放和双击事件,它们还可以跟踪鼠标的移动。

Graphics View 使用 BSP(Binary Space Partitioning,二进制空间分区)树提供了非常快速的图元发现功能,因此,它可以实时可视化大型场景(甚至可以包含数百万个图元)。下面列出 Graphics View Framework 的常用模块:
Shape
Graphics
View
Graphics
QtWidgets.QGraphicsItem
QtWidgets.QAbstractGraphicsShapeItem
QtWidgets.QGraphicsEllipseItem
QtWidgets.QGraphicsPathItem
QtWidgets.QGraphicsPolygonItem
QtWidgets.QGraphicsRectItem
QtWidgets.QGraphicsSimpleTextItem
QtWidgets.QGraphicsWidget
QtCharts.QChart
QtWidgets.QFrame
QtWidgets.QAbstractScrollArea
QtWidgets.QGraphicsView
QtCore.QObject
QtWidgets.QGraphicsScene
QtWidgets.QGraphicsLayoutItem
QtGui.QPaintDevice
QtWidgets.QWidget
QtWidgets.QGraphicsItemGroup
QtWidgets.QGraphicsLineItem
QtWidgets.QGraphicsPixmapItem
QtWidgets.QGraphicsObject
QtWidgets.QGraphicsTextItem
1 The Graphics View Architecture

Graphics View 提供了一种基于项目(item-based)的方法来进行模型-视图编程(model-view programming),非常类似于 InterView 的便利类 QTableView,QTreeView 和 QListView。多个视图可以观察单个场景,并且该场景包含各种几何形状的图元项目。
1.1 The Scene

QtWidgets.QGraphicsScene 提供了 Graphics View 场景。QGraphicsScene 类提供了一个用于管理大量 2D 图形项目的容器(surface)。

场景具有如下功能:

提供用于管理大量图元项目的快速界面
将事件传播到每个图元项目
管理图元项目状态,例如选择和焦点处理
提供未被转换的渲染功能;主要用于印刷

场景用作 QtWidgets.QGraphicsItem 对象的容器。它与 QtWidgets.QGraphicsView 一起用于可视化 2D 曲面上(2D surface)的图形项目,例如线条,矩形,文本,甚至是自定义项目。通过调用 addItem() 将图元项目添加到场景中,然后通过调用许多项目查找功能之一来检索项目。

请注意,QGraphicsScene 没有自己的视觉外观。它只管理图元项目。您需要创建一个 QGraphicsView 小部件以可视化场景。

要将项目添加到场景,首先需要构造一个 QGraphicsScene 对象。然后,您有两个选择:通过调用 addItem() 添加现有的 QGraphicsItem 对象,或者可以调用下列便捷函数之一 addEllipse(),addLine(),addPath(),addPixmap(),addPolygon(),addRect() 或 addText(),它们都返回一个指向新添加项目的指针。使用这些函数添加的图元的维度是相对于图元(item)的坐标系的,并且图元的位置在场景中被初始化为 (0,0)

您可以使用 QGraphicsView 可视化场景。当场景发生变化时(例如,当某项移动或变换时),QGraphicsScene 发出 change() 信号。要删除项目,请调用 removeItem()。

QGraphicsScene 使用索引算法来有效地管理项目的位置。默认情况下,使用 BSP(二进制空间分区)树;一种适用于大型场景的算法,其中大多数图元保持静止(即不要四处移动)。您可以选择通过调用 setItemIndexMethod() 禁用此索引。

通过调用 setSceneRect() 设置场景的边界矩形。可以将图元项目放置在场景中的任何位置,默认情况下,场景的大小不受限制。场景 rect 仅用于内部簿记,维护场景的图元项目索引。如果未设置场景矩形,则 QGraphicsScene 将使用 itemsBoundingRect() 返回的所有项目的边界区域作为场景矩形。但是,itemsBoundingRect() 是一个相对耗时的函数,因为它通过收集场景中每个项目的位置信息进行操作。因此,在大型场景上操作时,应始终设置场景 rect。

QGraphicsScene 的最大优势之一就是能够有效确定图元的位置。即使场景中有数百万个项目,items() 函数也可以在几毫秒内确定项目的位置。items() 有多个重载:一个重载在某个位置查找项目,一个重载在多边形或矩形内部或与之相交,等等。返回的项目列表按堆叠顺序排序,最高的项目是列表中的第一项目。为了方便起见,还有一个 itemAt() 函数可在给定位置返回最上面的项目。

QGraphicsScene 还管理某些图元项目状态,例如图元项目选择和焦点。要选择项目,请调用 setSelectionArea()(传递任意形状来选择场景中的项目),并要清除当前选择,请调用clearSelection()。调用 selec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值