图形视图体系(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中,创建复杂的嵌套视图体系