Qt5 图形视图框架(Graphics View Framework)官方文档翻译
Qt文档原文:Qt5 Graphics View Framework
翻译/审校:https://blog.csdn.net/qilei2010
逐句审校。
部分术语:
Graphics Item :图元。
图形视图框架(Graphics View Framework)
Graphics View 提供了一个可对大量自定义二维图元(custom-made 2D graphical items)进行管理和交互的界面,以及一个用于可视化这些图元的视图小部件(view widget),并支持缩放和旋转。
该框架包括一个事件传播体系结构,该体系允许对场景中的图元进行精确的双精度级交互(precise double-precision interaction capabilities)。Items 可以处理按键事件、鼠标按下、移动、释放和双击事件,还可以追踪鼠标移动。
Graphics View 使用BSP(Binary Space Partitioning)树来提供非常快速的图元检索(discovery),因此,它可以实时地可视化大型场景,即使有数百万个图元(items)。
Graphics View 是在 Qt 4.2版本引入的,取代它的前身QCanvas。
图形视图体系结构(The Graphics View Architecture)
Graphics View 为模型视图编程(model-view programming)提供了一种基于项的方法(item-based approach),很像InterView的便利类:QTableView, QTreeView and QListView. 多个视图(views)可以观察单个场景(scene),场景(scene)可包含不同几何形状的图元(items )。
场景(The Scene)
QGraphicsScene 提供图形视图场景(Graphics View scene)。Scene 有以下职责:
- 为管理大量图元(items)提供快速界面
- 将事件传播到每个图元
- 管理图元状态,例如处理选中(selection )和焦点(focus)状态
- 提供未转换的渲染功能;主要用于印刷(printing)
场景(The scene)作为 QGraphicsItem 对象的容器。通过调用 QGraphicsScene::addItem() 将项目添加到场景,然后通过调用查找图元的函数来得到指定图元。
QGraphicsScene::items() 及它的重载函数返回被点、矩形、多边形或一般的向量路径(vector path)包含或与之相交的所有图元。
QGraphicsScene::itemAt() 返回指定点的最上面的图元。所有的查找图元的函数都是从顶部向底部顺序返回图元(即,最上面的图元首先返回,最底部的图元最后返回)。
QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));
QGraphicsItem *item = scene.itemAt(50, 50);
// item == rect
QGraphicsScene 的事件传播机制安排场景的事件传递到指定的图元,它也管理图元间的事件传播。如果场景(Scene)在某个位置接收到鼠标按下事件,则场景(Scene)会将该事件传递到在该位置的任何一个图元(item)。
QGraphicsScene 也管理 图元的特定状态,比如图元的选中和聚焦状态(focus)。
你可以调用 QGraphicsScene::setSelectionArea() 并传入一个任意的形状作为参数,从而选中场景内的图元。这个功能也是 QGraphicsView 中框选(rubberband selection)图元的实现基础。可使用 QGraphicsScene::selectedItems() 获取当前被选中的所有图元列表。
QGraphicsScene 管理的另一个状态是,图元是否为当前键盘输入的焦点(keyboard input focus)。可使用 QGraphicsScene::setFocusItem() 或者 QGraphicsItem::setFocus() 设置某个图元作为交互焦点(focus),或使用 QGraphicsScene::focusItem() 获取当前聚焦的图元。
最后,QGraphicsScene 可通过使用 QGraphicsScene::render() 方法将场景(Scene)的部分渲染到一个绘图设备(paint device)。本文接下来的 Printing 章节会深入介绍。
视图(The View)
QGraphicsView 提供用于可视化场景内容的视图小部件(view widget)。可以将多个视图(view)附加到同一个场景(scene),以便为同一数据集中提供多个视窗(viewports)。视图小部件(view widget)是一个可滚动区域,它提供了用于在大型场景中导航的滚动条。若要启用OpenGL支持,可以通过调用 QGraphicsView::setViewport() 设置 QGLWidget作为视窗(viewport)。
QGraphicsScene scene;
myPopulateScene(&scene);
QGraphicsView view(&scene);
view.show();
视图(view)从键盘和鼠标接收输入事件,并在将原始事件发送到可视化场景之前将这些原始事件转换为场景事件(将原始坐标转换为合适的场景坐标)。
利用转换矩阵(transformation matrix),QGraphicsView::transform() ,视图(view)可以转换场景(scene)的坐标系统。这就能实现较为高级的功能,如缩放和旋转。为了方便,QGraphicsView视图提供了在视图和场景坐标之间转换的函数:QGraphicsView::mapToScene() 和 QGraphicsView::mapFromScene()。
图元(The Item)
QGraphicsItem 在场景(Scene)中是所有图形元素的基类。Graphics View 提供了几种典型形状的标准图元类(standard items),比如矩形(QGraphicsRectItem),椭圆形(QGraphicsEllipseItem),文字(QGraphicsTextItem),但是 QGraphicsItem 最强大的特点是可以自定义图元。除此之外,QGraphicsItem 还支持以下功能:
- 鼠标按下、移动、释放和双击事件,以及鼠标悬停事件、滚轮事件和上下文菜单事件
- 键盘输入焦点事件和按键事件
- 拖放
- 组合,通过父子关系(parent-child relationships)或者使用 QGraphicsItemGroup
- 碰撞检测
图元(Item)使用自己的坐标系,但同时它也像 QGraphicsView 一样,也提供在图元和场景间、图元和图元间互相转换坐标系的函数。和 QGraphicsView 类似,图元也通过调用自己的 QGraphicsItem::transform() 函数使用矩阵转换坐标系。这在旋转和缩放单独的某个图元时很有用。
图元(Item)可以包含其他图元(子图元)。父图元的各种变换由其所有子图元继承。但是,无论一个图元怎么变换,该图元的所有函数(例如 QGraphicsItem::contains(), QGraphicsItem::boundingRect(), QGraphicsItem::collidesWith() )仍在图元内部自己的坐标系内执行。
QGraphicsItem 支持通过 QGraphicsItem::shape() 和 QGraphicsItem::collidesWith() 这两个虚函数进行碰撞检测。通过使用QGraphicsItem::shape() 函数返回图元的形状(以局部坐标系内的 QPainterPath形式返回),QGraphicsItem 可以自动为你处理所有的碰撞检测工作。若要实现自己的碰撞检测,可重新实现 QGraphicsItem::collidesWith()。