zhonghua

C++博客 首页 新随笔 联系 聚合 管理
  72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

概念

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

posted on 2013-02-06 10:38 米米 阅读(1947) 评论(0)  编辑 收藏 引用 所属分类: qt

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理