Qt Graphics View Framework

  Graphics View提供一个管理大量自定义的2D绘图项目并处理他们之间相互影响的接口, 有一个使得这些项目可视化的view部件,它支持缩放和旋转。

该框架包括一个事件传播结构,它允许情景中的项目之间的精确的双精度交互能力。项目能处理关键事件,鼠标按下,移动,释放和双击事件,也能跟踪鼠标移动。

Graphics View使用一个BSP树来提供快速的项目发现,这样做的结果是,能实时可视化大情景,甚至是数百万的项目。

Graphics View是Qt4.2中引入的,替换了他的前辈QCanvas。如果你是从QCanvas转来的, 参看 Porting to Graphics View。


主题:

    Graphics View结构
        Scene
        View
        Item
    Graphics View的坐标系统
        Item的坐标系统
        情景的坐标系统
        视图的坐标系统
        坐标映射
    关键特性
        缩放和旋转
        打印
        拖拉
        鼠标和工具提示
        动画
        OpenGL渲染
        Item组

 

Graphics View的结构
  Graphics View为model-view编程提供了一个基于项目的方法,就像 InterView的便利类QTableWidget, QTreeWidget和QListWidget。几个试图可以观察同一个情景,情景包括多种多样几何形状的项目。

    情景
  QGraphicsScene提供Graphics View情景。该情景有下列一些责任:
        为管理大量项目提供一个快速的接口
        为项目之间传播事件
        管理项目状态,像选择及焦点处理
        提供不用转换的渲染功能,这主要应用在打印上

情景服务就像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也管理某些项目状态,像项目选择和焦点。在情景中能调用 QGraphicsScene::setSelectionArea()来选择项目,并传递给任意形状。该函数也是QGraphicsView中橡皮条选 择的基础。用QGraphicsScene::selectedItems()来获取当前选择的项目。也可以调用 QGraphicsScene::setFocusItem() or QGraphicsItem::setFocus()来把焦点放在一个项目上。调用QGraphicsScene::focusItem()来获取当前项 目。

最后,QGraphicsScene允许用QGraphicsScene::render()函数来着色情景的一些部分。你可以在本文档的打印部分读到更多信息。


    视图
  QGraphicsView提供视图部件,它将情景的内容可视化。可以为一个情景贴上几个视图来提供几个同一个数据集的几个视口。 View部件是一个卷轴区域,也提供滚动条为大情景导航。可以调用QGraphicsView::setViewport()设置QGLWidget作为 一个视口来获取OpenGL支持。

    视图接受鼠标键盘的输入事件,在把该事件发送到可视化情景前转换为情景事件(把原来的坐标转换为情景坐标)。

    用转换矩阵QGraphicsView::matrix(),视图可以转换情景的坐标系统。这允许像缩放和旋转之类的高级导航功能。为方便使 用,QGraphicsView也提供视图和情景之间的坐标转换函数:QGraphicsView::mapToScene() and QGraphicsView::mapFromScene()。

    项目
    QGraphicsItem是情景中绘图的基本类。Graphics View提供几个典型形状的标准项目,如矩形(QGraphicsRectItem)、椭圆(QGraphicsEllipseItem)、文本 (QGraphicTextItem),但你可以自定义大部分功能更强大的QGraphicsItem。QGraphicsItem支持下列特性:
        鼠标按下、移动、释放、双击事件,还有鼠标悬空,滚轮,上下文菜单事件。
        键盘输入焦点,关键事件
        拖放
        分组,可以通过父子关系,也可以用QGraphicsItemGroup
        冲突探测

  项目在像QGraphicsView这样的当前坐标系统中,也提供许多项目和情景之间坐标映射的函数,还有从项目到项目。此外它和 QGraphicsWview一样,能用矩阵QGraphicsItem::Matrix()来转换它的坐标系统。这在单个项目的旋转和缩放中是很有用 的。
    项目能包含其他项目(子项目)。父项目的转换被所有子项目继承。不管一个项目的累积转换,但,所有它的函数(e.g., QGraphicsItem::contains(), QGraphicsItem::boundingRect(), QGraphicsItem::collidesWith())仍然在本地坐标系统中操作。
  QGraphicsItem通过QGraphicsItem::shape()和QGraphicsItem::collidesWith()函数来支持 冲突探测,这是两个虚函数。By returning your item's shape as a local coordinate QPainterPath from QGraphicsItem::shape(), QGraphicsItem will handle all collision detection for you. If you want to provide your own collision detection, however, you can reimplement QGraphicsItem::collidesWith().

 

Graphics View的坐标系统

Grapchics View基于笛卡尔坐标系统;情景中的项目的位置和几何表现为两个数字的集合:X坐标和Y坐标。当用非转换视图来查看一个情景时,情景中的一个单元表现为屏幕上的一个像素。

Graphics View中涉及三个相关坐标系统:项目坐标,情景坐标,视图坐标。为了简化你的执行,Graphics View提供有用的函数来在这三个坐标系统之间映射。

渲染时,Graphics View的情景坐标系统相当于QPainter的逻辑坐标,视图坐标系统相当于设备坐标。在The Coordinate System中,能了解到逻辑坐标和设备坐标之间的关系。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值