QGraphics框架概念理解

QGraphics是QT提供的一套设计UI的框架

一 介绍:

1、
Graphics View:图形视图。
Scene:场景 /场景管理器( Scene 同时担负着管理场景中的对象,建立索引等工作)。
Item:(显示)对象,场景中可以被显示的元素。这里翻译成对象便于理解。
GraphicsItem:图形对象。
Event:事件,等同于 Windows 下的消息。

2、
GraphicsView 提供:支持大量自定义的二维图形对象交互( Interaction )的管理器;
一个支持缩放和旋转操作的视图 widget 用于显示这些元素。

3、
该框架包含了事件( Event )传播的框架,支持场景管理器中精确的交互能力,以双精度浮点数表示对象位置、大小等属性的变化。
图形元素还能处理键盘事件、鼠标按下 / 移动 / 释放和双击的时间,同时也能跟踪鼠标移动。
图形视图提供对图形对象的快速查找,即使是包含数以百万计对象的超大场景,也能够进行实时显示。

二 框架:

1、
QGraphicsView(视图):
图形视图,不同的视图可以显示一个场景(scene),场景(scene)则包含了不同的几何形状的对象(item)。

QGraphicsView 提供了视图 widget,将场景中的内容显示出来。

用几个不同的视图来观察同一个场景,从而实现对于同一数据集的不同 viewport。

该 Widget 同时也是 scroll area,为大场景提供滚动条。

视图接受键盘和鼠标消息,并将这些消息转换成场景事件(同时将视图坐标转换为场景坐标),然后将事件发送给可见视图。

通过操作变换矩阵 QGraphicsView::transform ,视图可以对场景的坐标系统进行变换,从而实现缩放、旋转等高级查看功能。

2、
QGraphicsScene(场景) :
QGraphicsScene 提供了图形视图的场景管理器。场景管理器有如列职责:
• 提供一个用于管理大量对象的快速接口
• 将事件传递到每个对象上
• 管理对象的状态
• 提供未进行坐标变换的渲染功能,主要用于打印

场景管理器是图形对象 QGraphicsItem 的容器。

QGraphicsScene 的事件传递机制负责将场景事件传递给图形对象,同时也管理对象之间的事件传递。

如果场景在某个位置得到鼠标按下的消息,就将该事件传递给这个位置上的对象。

QGraphicsScene 同时还管理对象的状态,例如对象的选中状态和焦点状态。

QGraphicsScene 允许你通过 QGraphicsScene::render ()将部分场景绘制到 paintdevice 上。

3、
QGraphicsItem(对象):
QGraphicsItem是场景中所有图形独享的基类。图形视图提供了几种标准的对象:矩形 , 椭圆和文本对象。

但是 QGraphicsItem 最强大的功能是支持定制的图形对象。
QGraphicsItem 支持如下特征:
• 鼠标按下、移动、释放和双击事件,同时还支持鼠标悬浮事件、滚轮事件和上下文菜单事件。
• 键盘输入焦点和键盘事件。
• 拖放。
• 组合:通过父对象 -子对象进行组合,或者通过 QGraphicsItemGroup 组合。
• 碰撞检测。

与 QGraphicsView 类似,处于局部坐标系下的图形对象,也提供了图形对象和场景之间的映射函数。

和 QGraphicsView 一样,图形对象同时还可以通过矩阵来变换其自身的坐标系统,这一点对于单个图形对象的旋转和缩放非常有用。

每个图形对象可以包含其他对象(子对象)。父对象的变换矩阵同样也会应用到子对象上。

三 交互框架:

• QAbstractGraphicsShapeItem 所有路径对象的共同基类
• QGraphicsAnchor 代表了 QGraphicsAnchorLayout 中 两个项目之间的 anchor
• QGraphicsAnchorLayout 如何将 widgets anchor 到图形视图中
• QGraphicsEffect 所有图形特效的基类
• QGraphicsEllipseItem 椭圆对象,可以直接添加到QGraphicsScene
• QGraphicsGridLayout 管理 widgets 在图形视图中的布局
• QGraphicsItem 在 QGraphicsScene 中所有图形对象的基类
• QGraphicsItemAnimation 为 QGraphicsItem 提供简单的 动画支持
• QGraphicsItemGroup 将多个图形对象组合成一个对象
• QGraphicsLayout 图形视图中所有布局类的基类
• QGraphicsLayoutItem 允许布局类管理的自定义对象
• QGraphicsLineItem 直线对象,可以直接添加到QGraphicsScene
• QGraphicsLinearLayout 管理 widgets 在图形视图中的的水平或者垂直方向上的布局
• QGraphicsObject 所有需要处理信号 /槽 /属性的图形对象。
• QGraphicsPathItem 路径对象,可以直接添加到QGraphicsScene
• QGraphicsPixmapItem 位图对象,可以直接添加到QGraphicsScene
• QGraphicsPolygonItem 多边形对象,可以直接添加到QGraphicsScene
• QGraphicsProxyWidget widget 代理,用于将一个 QWidget 对象嵌入 一个 QGraphicsScene 中
• QGraphicsRectItem 矩形对象,可以直接添加到QGraphicsScene
• QGraphicsScene 管理大量二维图形对象的管理器
• QGraphicsSceneContextMenuEvent 在图形视图框架中的上下文菜单事件
• QGraphicsSceneDragDropEvent 图形视图框架中的拖放拖放事件
• QGraphicsSceneEvent 图形视图框架中所有事件的基类
• QGraphicsSceneHelpEvent Tooltip 显示时发出的事件
• QGraphicsSceneHoverEvent 图形视图框架中的悬停事件
• QGraphicsSceneMouseEvent 图形视图框架中的鼠标事件
• QGraphicsSceneMoveEvent 图形视图框架中的 widget 移动事件
• QGraphicsSceneResizeEvent 图形视图框架中的 widget 大小改变的事件视
• QGraphicsSceneWheelEvent 图形视图框架中的鼠标滚轮时间
• QGraphicsSimpleTextItem 简单的文本对象,可以直接添加到QGraphicsScene 中
• QGraphicsSvgItem 可以用来呈现的 SVG 文件内容的QGraphicsItem对象
• QGraphicsTextItem 文本对象,可以直接添加到
• QGraphicsScene 用于 显示带格式的文本
• QGraphicsTransform 创建 QGraphicsItems 高级矩阵变换的抽象类
• QGraphicsView 显示 QGraphicsScene 内容的 widget
• QGraphicsWidget QGraphicsScene 中所有 widget 的基类
• QStyleOptionGraphicsItem 用于描述绘制 QGraphicsItem 所需的 参数

四 坐标系

图形视图使用了 Qt 的坐标系,不支持反转的 y 轴坐标系统(即 y 向上为正方向)。

图形视图使用了三种有效的坐标系:对象坐标,场景坐标和视图坐标。

图形视图的场景坐标对应于 QPainter 的逻辑坐标。

视图坐标与设备坐标一致。

1、对象坐标系
图形对象建立其自身的局部坐标系下。该坐标系通常以( 0, 0)为中心,同时该点也是各种矩阵变换的中心。

创建自定义图形对象的时候,你只需关注对象坐标系即可。 对象的包围盒和形状都是基于对象坐标系的。

对象的位置,是指 对象坐标系下的中心点 在其 父对象坐标系下 的位置。对于所有没有父对象的对象来说,场景就是其父对象。因此 最顶层对象的位置 就是其在场景中的位置。

由于对象的位置和变换是相对于父对象来说的,所以父对象的变换会隐式地变换了子对象,子对象的坐标系不会因父对象坐标系改变而改变,子对象相对父对象是不会变的,但是父对象变换,会引起子对象在场景中变化。

QGraphicsItem 提供的函数一般总是表示在对象坐标系下的位置,但是QGraphicsItem::pos 是例外之一,该函数表示其在父对象中的位置 。QGraphicsItem::sceneBoundingRect,该函数表示其在父对象中的盒子。

2、场景坐标系
场景表示了其中所有对象的基础坐标系。场景坐标系描述了每一个顶层对象的位置,同时也是所有从视图传递到场景的事件的变化基础。

场景中的每一个对象都有其在场景中的位置和包围盒,另外,也有其自身的位置和包围盒。

场景位置描述了对象在场景坐标系下的位置,场景包围盒则提供给 QGraphicsScene 来决定场景中的哪一块区域已经被改变了。

场景中的变化通过 QGraphicsScene::changed ()信号发出,参数是场景坐标系下的矩形列表。

3、视图坐标系
视图坐标系是 widget 的坐标系。视图坐标系下的每个单位对应于一个像素。

对于该坐标系来说比较特殊的一点是,它是相对于 widget 或者 viewport 的坐标系,不会受到被显示的场景的影响。 QGraphicsView 的 viewport 左上角坐标总是(0,0)右下角坐标总是(vieport宽度,vieport高度)。

所有的鼠标事件和拖拽事件都在视图坐标系下接收,需要将这些坐标映射到场景中后才能与场景中的图形对象进行交互。

4、坐标映射
通常当我们处理场景中的对象的时候,坐标变换将会非常有用,我们可以把坐标或者任意形状从场景变换到对象坐标系下,从一个对象坐标系变换到另一个对象坐标系,或者从视图变换到场景。

5、缩放和旋转
和 QPainter 一样 QgraphicsView 也可以通过QGraphicsView::setMatrix ()支持缩放变换。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值