QT

图形视图框架

2017-05-07  本文已影响0人  托尼章

概述

图形视图为我们提供了一个支持大量自定义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().


Image_00.png

图形项(Item)

QGraphicsItem是场景中图形项的基类,图形视图框架提供了几个标准图形项,例如QGraphicsRectItem,QGraphicsEllipseItem,QGraphicsTextItem.我们当然可以继承QGraphicItem来自定义图形项.图形项还支持以下特性:

图形视图框架主要类

类名 描述
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

图形视图坐标系

上一篇下一篇

猜你喜欢

热点阅读