源码解析6-系统封装-图形视图框架(Graphics View Framework )

Qt源码解析 索引

源码解析6–图形视图框架(Graphics View Framework )

图形视图框架(Graphics View Framework )

​ Graphics View 提供了一个用于管理大量定制 2D 图形项目并与之交互的界面,以及一个用于可视化项目的视图小部件,支持缩放和旋转。

该框架包括一个事件传播架构,允许对场景中的项目进行精确的双精度交互功能。 项目可以处理按键事件,鼠标按下、移动、释放和双击事件,它们还可以跟踪鼠标移动。

​ 图形视图使用 BSP(二进制空间分区)树来提供非常快速的项目发现,因此,它可以实时可视化大型场景,即使有数百万个项目。

Graphics View 是在 Qt 4.2 中引入的,取代了它的前身 QCanvas。

话题:

图形视图架构(The Graphics View Architecture)

Graphics View 为模型视图编程提供了一种基于项目的方法,很像 InterView 的便利类QTableView、QTreeView和QListView。多个视图可以观察单个场景,场景包含不同几何形状的项目。

场景(The Scene)

QGraphicsScene 提供图形视图场景。场景有以下职责 :

  • 提供用于管理大量项目的快速界面 Providing a fast interface for managing a large number of items
  • 将事件传播到每个项目 Propagating events to each item
  • 管理项目状态,例如选择和焦点处理 Managing item state, such as selection and focus handling
  • 提供未转换的渲染功能;主要用于印刷 Providing untransformed rendering functionality; mainly for printing

​ 场景充当QGraphicsItem对象的容器。通过调用QGraphicsScene::addItem ()将项目添加到场景中,然后通过调用许多项目发现函数之一来检索。QGraphicsScene::items () 及其重载函数,能够返回点、矩形、多边形或一般矢量路径等包含或相交的所有项目。QGraphicsScene::itemAt () 返回特定点的最顶层项目。所有项目发现函数都按堆叠降序返回项目(即,第一个返回的项目在最上面,最后一个项目在最底部)

  QGraphicsScene scene;
  QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));

  QGraphicsItem *item = scene.itemAt(50, 50);
  // item == rect

​ QGraphicsScene的事件传播架构安排场景事件以传递给项目,并管理项目之间的传播。如果场景在特定位置接收到鼠标按下事件,则场景会将事件传递给位于该位置的任何项目。

​ QGraphicsScene还管理某些项目状态,例如项目选择和焦点。您可以通过调用GraphicsScene::setSelectionArea () 传递任意形状来选择场景中的项目。此功能还用作QGraphicsView中橡皮筋选择的基础。要获取所有当前选中项的列表,请调用QGraphicsScene::selectedItems ()。QGraphicsScene处理的另一个状态是某个项目是否具有键盘输入焦点。可以通过调用QGraphicsScene::setFocusItem ()或QGraphicsItem::setFocus ()来设置焦点在一个item上,或者通过调用QGraphicsScene::focusItem ()来获取当前焦点item 。

​ 最后,QGraphicsScene允许您通过QGraphicsScene::render () 函数将部分场景渲染到绘图设备中。

视图(The View)

QGraphicsView提供视图小部件,它可视化场景的内容。您可以将多个视图附加到同一场景,以将多个视口提供到同一数据集中。视图小部件是一个滚动区域,并提供用于在大场景中导航的滚动条。要启用 OpenGL 支持,您可以通过调用QGraphicsView::setViewport ()将QOpenGLWidget设置为视口。 
  QGraphicsScene scene;
  myPopulateScene(&scene);

  QGraphicsView view(&scene);
  view.show();

​ 视图从键盘和鼠标接收输入事件,并将这些事件转换为场景事件(在适当的地方将使用的坐标转换为场景坐标),然后再将事件发送到可视化场景。

​ 使用它的变换矩阵,QGraphicsView::transform (),视图可以变换场景的坐标系。这允许高级导航功能,例如缩放和旋转。为了方便起见,QGraphicsView还提供了在视图坐标和场景坐标之间进行转换的函数:QGraphicsView::mapToScene () 和QGraphicsView::mapFromScene ()

项目(The Item)

QGraphicsItem是场景中图形项的基类。Graphics View 为典型的形状提供了几个标准项目,例如矩形(QGraphicsRectItem)、椭圆(QGraphicsEllipseItem)和文本项目(QGraphicsTextItem),但是最强大的QGraphicsItem功能在您编写自定义项目时可用。除其他外,QGraphicsItem支持以下功能: :

  • 鼠标按下、移动、释放和双击事件,以及鼠标悬停事件、滚轮事件和上下文菜单事件
  • 键盘输入焦点和按键事件
  • 拖放
  • 通过父子关系和QGraphicsItemGroup进行分组
  • 碰撞检测

​ 项目存在于局部坐标系中,并且像QGraphicsView一样,它还提供了许多用于在项目和场景之间以及项目与项目之间映射坐标的函数。此外,与QGraphicsView一样,它可以使用矩阵转换其坐标系:QGraphicsItem::transform ()。这对于旋转和缩放单个项目很有用。

​ 项目可以包含其他项目(子项)。父项的转换由其所有子项继承。然而,无论项目的累积变换如何,它的所有函数(例如,QGraphicsItem::contains ()、QGraphicsItem::boundingRect ()、QGraphicsItem::collidesWith())仍然在局部坐标中运行。

​ QGraphicsItem通过QGraphicsItem::shape ()函数和QGraphicsItem::collidesWith()函数支持碰撞检测,这两个函数都是虚函数。通过从QGraphicsItem::shape ()返回你的项目的形状作为局部坐标QPainterPath , QGraphicsItem将为你处理所有的碰撞检测。但是,如果你想提供自己的碰撞检测,你可以重新实现 QGraphicsItem::collidesWith()。

图形视图框架中的类

这些类提供了用于创建交互式应用程序的框架。

QAbstractGraphicsShapeItem所有路径项的公共基础
QGraphicsAnchor表示 QGraphicsAnchorLayout 中两个项目之间的锚点
QGraphicsAnchorLayout可以在图形视图中将小部件固定在一起的布局
QGraphicsEffect所有图形效果的基类
QGraphicsEllipseItem可以添加到 QGraphicsScene 的椭圆项目
QGraphicsGridLayout用于在图形视图中管理小部件的网格布局
QGraphicsItemQGraphicsScene 中所有图形项的基类
QGraphicsItemGroup将一组项目视为单个项目的容器
QGraphicsLayout图形视图中所有布局的基类
QGraphicsLayoutItem可以继承以允许您的自定义项目由布局管理
QGraphicsLineItem可以添加到 QGraphicsScene 的行项目
QGraphicsLinearLayout用于在图形视图中管理小部件的水平或垂直布局
QGraphicsObject所有需要信号、槽和属性的图形项的基类
QGraphicsPathItem可以添加到 QGraphicsScene 的路径项
QGraphicsPixmapItem可以添加到 QGraphicsScene 的像素图项目
QGraphicsPolygonItem可以添加到 QGraphicsScene 的多边形项
QGraphicsProxyWidget用于在 QGraphicsScene 中嵌入 QWidget 的代理层
QGraphicsRectItem可以添加到 QGraphicsScene 的矩形项
QGraphicsScene用于管理大量 2D 图形项的表面
QGraphicsSceneContextMenuEvent图形视图框架中的上下文菜单事件
QGraphicsSceneDragDropEvent图形视图框架中的拖放事件
QGraphicsSceneEvent所有图形视图相关事件的基类
QGraphicsSceneHelpEvent请求工具提示时的事件
QGraphicsSceneHoverEvent图形视图框架中的悬停事件
QGraphicsSceneMouseEvent图形视图框架中的鼠标事件
QGraphicsSceneMoveEvent在图形视图框架中移动的小部件事件
QGraphicsSceneResizeEvent在图形视图框架中调整小部件大小的事件
QGraphicsSceneWheelEvent图形视图框架中的车轮事件
QGraphicsSimpleTextItem可以添加到 QGraphicsScene 的简单文本路径项
QGraphicsSvgItem可用于呈现 SVG 文件内容的 QGraphicsItem
QGraphicsTextItem可以添加到 QGraphicsScene 以显示格式化文本的文本项
QGraphicsTransform用于在 QGraphicsItems 上构建高级转换的抽象基类
QGraphicsView用于显示 QGraphicsScene 内容的小部件
QGraphicsWidgetQGraphicsScene 中所有小部件项的基类
QStyleOptionGraphicsItem用于描述绘制一个QGraphicsItem所需要的参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值