QT图形视图体系 (The Graphics View Framework)

时间:2022-06-16 12:10:09

图形视图体系(The Graphics View Framework)

作者:刘旭晖 Raymond 转载请注明出处
Email:colorant@163.com
BLOG:http://blog.csdn.net/colorant/

 

这里的内容,只是个人学习QT的官方文档时,记录的个人理解。用中文写,是因为官方英文文档已经非常详细,我不打算翻译一个中文的版本,所以,只是挑选了一些自己感兴趣的内容,记录一些要点和自己的理解等

 

英语好的同学可以直接看官方文档:http://doc.qt.nokia.com/4.6/graphicsview.html

 

概念

名称 含义
View 视图 视觉化一个场景
Scene 场景 用于管理图形项
Item 图形项 具体的图形对象

 

QT的图形视图架构采用Model-View模型,Scence里面包含多个Item,可以用多个View以不同的方式观察一个Scence

功能
Scene(QGraphicsScene)

  • 添加,删除,查询图项

  • 事件分发

  • 管理图项的选择状态和焦点

View (QGraphicsView)

  • 为Scene提供一个视图接口
  • 接收鼠标键盘事件,转换后发给Scene
  • 负责View和Scence之间的坐标变换 

可以为View设置不同的ViewPort控件,比如QGLWidget来支持OpenGL,Read More!

Item (QGraphicsItem)

 

图形项的基类是QGraphicItem

基础的Feature包括:

  • 处理鼠标键盘事件
  • 拖放
  • 分组
  • 碰撞检测

每个图形项都有自己的本例坐标系统,并提供它和场景坐标的转换函数。所以可以单独旋转或缩放某个一图形项


除了pos等很少的几个函数,图形项的多数函数所处理的坐标都是它的本地坐标(例如bounding rect)

坐标系统

如上所述视图体系采用三种坐标系统:

  • 视口坐标: 对应物理坐标/设备坐标
  • 场景坐标: 对应逻辑坐标
  • 项坐标: 本地坐标

window-viewport概念

window指定了逻辑坐标的矩形范围,viewport指定了设备坐标的矩形范围,和WorldTransform(世界转换矩阵)一起,决定了逻辑坐标和设备坐标之间的转换

 

可以使用QGraphicsItemAnimation来动画一个Item,使用QTimeLine来控制时间进度

 

其它特性

Animation动画

一个Item只能有效的和一个Animation对象关联(by QGraphicsItemAnimation::setItem),因为Animation对象设置图项Item的转换矩阵时,会替换对象现有的矩阵。所以你不能通过绑定多个Animation对象来做多重动画,但是你可以在一个Animation对象中设置多种变换效果(或者用分组的方法,分级控制?)


QGraphicsItemAnimation直接继承自QObject,和普通的QAbstractAnimation没有关系,所以没法只用用QAnimationGroup来组装,然后串行/并行使用多个动画。

 

图形控件和布局管理

QGraphicsWidget的目的是在图形对象的功能基础上提供类似QWidget的功能。(从QGraphicsObject和QGraphicsLayoutItem继承来),从而可以使用完整的Widget控件属性,设置字体,Style,提供size hints,以及信号槽机制等。

 

QGraphicsLayout是专门用来布局QGraphicsWidget的布局控件。你可以通过多重继承QGraphicsLayoutItem来定制QGraphicsItem使其能被QGraphicsLayout所管理

嵌入普通控件

你可以通过QGraphicsScene::addWidget来将一个普通QWidget嵌入到视图体系中来使用,本质是通过创建一个代理控件(QGraphicsProxyWidget)来在QWidget和QGraphicsItem之间传递事件。需要注意的是,这只是一个特殊的实现方式,对性能有要求的程序不宜使用这个机制。(没有太看出哪里对性能有很大影响)

 

QGraphicsProxyWidget能够处理复杂的控件嵌套,甚至能自动对被嵌套控件的子Popup Window控件创建代理控件。
 

QGraphicsView本身也是一个普通QWidget控件,所以可以被添加到Scene中,创建复杂的嵌套视图体系