概述
图形视图为我们提供了一个支持大量自定义2D图形项的管理和交互的平台,和一个支持旋转和缩放的视图widget来显示这些图形项.
该框架包括事件传播架构,可以为场景中的图形项提供精确的双精度交互功能。图形项可以处理键盘事件,鼠标按下,移动,释放和双击事件,还可以跟踪鼠标移动.
图形视图使用BSP(二叉控件分割)树来提供快速的图形项发现,正因为如此,它可以高效的实时的显示包含有百万数量级图形项的大型场景.
图形视图体系架构
图形视图提供了基于项的模型-视图编程模型,这很类似于QTableView,QTreeView,QListView之类的交互快捷类.多个视图可以同时观察同一个场景,场景中包含有各种几何图形项.
场景(Scene)
QGraphicsScene 提供了图形视图场景,场景负责完成一下任务:
- 提供一个快速管理大量图形项的接口.
- 向每个图形项传递事件
- 管理图形项的状态,例如选中,焦点处理等.
- 提供无变形的渲染功能,主要用于打印.
QGraphicsScene是QGraphicsItem对象的容器.通过调用QGraphicsScene::addItem()来把QGraphicsItem对象添加到场景中.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还管理图形项的状态,例如选择和焦点状态.
调用QGraphicsScene::setSelectionArea()来选中图形项,
调用QGraphicsScene::selectedItems()来获取选中的图形项.
调用QGraphicsScene::setFocusItem()来设置图形项获取焦点.
调用QGraphicsScene::focusItem()来获取当前有焦点的图形项.
最后:
调用QGraphicsScene::render()来把场景的一部分渲染到绘图设备中.
视图(View)
QGraphicsView为场景内容的可视化提供了视图小组件(widget).可以同时把多个视图附加到同一个场景上,这样就可以为同一数据集提供不同的显示形式了.视图组件是一个滚动区域,当场景过大时就会出现滚动条来方便浏览整个场景.为了支持OpenGL,可以通过调用QGraphicsView::setViewport()来设置一个QGLWidget作为视图端口.
QGraphicsScene scene;
myPopulateScene(&scene);
QGraphicsView view(&scene);
view.show();
视图接收到键盘和鼠标的输入事件后会将其转换为场景事件(坐标转换为合适的场景坐标),再有场景来分发.
使用变换矩阵,QGraphicsView::transfrom(),视图可以变换场景的坐标系统,以便处理高级浏览特性,例如缩放和旋转.为了方便,QGraphicsView提供视图和场景坐标系之间的转换函数:QGraphicsVeiw::mapToScene()和QGraphicsView::mapFromScene().
图形项(Item)
QGraphicsItem是场景中图形项的基类,图形视图框架提供了几个标准图形项,例如QGraphicsRectItem,QGraphicsEllipseItem,QGraphicsTextItem.我们当然可以继承QGraphicItem来自定义图形项.图形项还支持以下特性:
- 鼠标:按下,移动,释放,双击,悬停,滚轮,上下文菜单事件.
- 键盘输入聚焦,和按键事件
- 拖放事件
- 分组:父子关系或者使用QGraphicsItemGroup.
- 碰撞检测
图形项与QGraphicsView一样,存在于局部坐标系统中,它提供了很多函数用于在项和场景之间,图形项与图形项之间进行坐标映射.另外,和QGraphicsView一样,它通过QGraphicsItem::matrix()函数变换它的坐标系统,这在旋转和缩放单个项时非常有用.
图形项可以包含另外的图形项(子项),父项的变换被它的所有子项继承.不管图形项的累积变换有多少,它的所有函数(如QGraphicsItem::contains()、QGraphicsItem::boundingRect(),QGraphicsItem::collidesWith())还是在局部坐标系统中操作.
QGraphicsItem通过QGRaphicsItem::shape()函数和QGraphicsItem::collidesWith()函数支持碰撞侦测,这两个都是虚函数.通过从QGraphicsItem :: shape()返回您的项目的形状作为局部坐标QPainterPath,QGraphicsItem将为您处理所有的碰撞检测.如果你想提供自己的碰撞侦测,则可以重新实现QGraphicsItem::collidesWith()函数.
图形视图框架主要类
类名 | 描述 |
---|---|
QGraphicsScene | 场景:容纳大量的2D图形项 |
QGraphicsView | 视图:显示场景中的图形项的窗口小组件 |
QGraphicsItem | 图形项:图形项的基类 |
QGraphicsEllipseItem | 椭圆 |
QGraphicsLineItem | 直线 |
QGraphicsRectItem | 矩形 |
QGraphicsPixmapItem | 位图 |
QGraphicsPathItem | 路径 |
QGraphicsPolygonItem | 多边形 |
QGraphicsSimpleTextItem | 简单文本 |
QGraphicsTextItem | 格式化文本 |
QGraphicsWidget | 小组件图形项的基类 |
QGraphicsProxyWidget | 把QWidget嵌入到QGraphicsScene中的代理层 |
QGraphicsSceneEvent | 图形视图相关事件的基类 |
QGraphicsSceneDragDropEvent | 拖放事件 |
QGraphicsSceneHoverEvent | 悬浮事件 |
QGraphicsSceneMouseEvent | 鼠标事件 |
QGraphicsSceneMoveEvent | 移动事件 |
QGraphicsSceneWheelEvent | 滚轮事件 |
QGraphicsSceneResizeEvent | 大小改变事件 |
QGraphicsSceneHelpEvent | tooltip提示事件 |
QGraphicsSceneContextMenuEvent | 上下文菜单事件 |
QGraphicsEffect | 图形效果的基类 |
QGraphicsAnchor | 表示QGraphicsAnchorLayout中两个图形项之间的锚点 |
QGraphicsAnchorLayout | 可以在图形视图中将窗口小部件锚在一起的布局 |
QGraphicsGridLayout | 网格布局 |
QAbstractGraphicsShapeItem | Common base for all path items |
QGraphicsItemGroup | Container that treats a group of items as a single item |
QGraphicsObject | Base class for all graphics items that require signals, slots and properties |
QGraphicsLayout | The base class for all layouts in Graphics View |
QGraphicsLayoutItem | Can be inherited to allow your custom items to be managed by layouts |
QGraphicsLinearLayout | Horizontal or vertical layout for managing widgets in Graphics View |
QGraphicsTransform | Abstract base class for building advanced transformations on QGraphicsItems |
QStyleOptionGraphicsItem | Used to describe the parameters needed to draw a QGraphicsItem |
QGraphicsSvgItem | QGraphicsItem that can be used to render the contents of SVG files |