概念
名称 | 含义 |
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中,创建复杂的嵌套视图体系