Qt的GraphicsView框架

GraphicsView框架是在Qt4.2中引入著名的图形应用开发框架Qt中的

    GraphicsView提供了一套基于item的model-view编程方法,几个view可以观察同一个scene,而scene可以包含具有不同几何形状的item
   
    Scene (QGraphicsScene)
         功能为:
         1 提供管理大量item的快速接口方法
         2 将事件通知给每个item
         3 管理item状态,比如选择和聚集处理
         4 提供untransformed渲染功能,主要用于printing
         
         scene是QGraphicsItem对象的容器,通过scene::addItem添加item,可通过多种方法取回对item的调用。          scene::items()返回 包含于一个点,矩形,多边形,或向量路径 ,或者与其相交的所有item
         scene::itemAt()返回指定点上最顶层的item(所有获取item的方法返回的结果都是按栈顶到栈底的次序排列的,即第一个是最上面的,最后一个是最下面的)
         示例如下:
Qt的GraphicsView框架

           scene的事件传播模型是将scene事件传递到item,同时也处理item之间的事件传递。若scene在某位置上收到一个鼠标按下事件,这个事件会传递到任何在那个位置的item
           scene也管理item状态,比如item选择和聚焦。可以通过scene::setSelectionArea()传入一个任意形状,以选择item。这个功能也是view中rubberband(橡皮筋)selection的基础。为获取所有当前选择的item的列表,可以调用scene::selectedItems()。scene处理的另一个状态是处理item是否有键盘输入聚焦。可以设置scene::setFocusItem()或者item::setFocus,也可以通过调用scene::focusItem()获取当前聚焦的item
           scene允许通过scene::render()渲染scene到显示设备
          
    view(QGraphicsView)
         功能:
         提供可视化scene内容的view组件,view组件是一个滚动区域,提供滚动条。若想获取OpenGL支持,可以通过调用view::setViewport()设置QGLWidget为viewport
         示例如下:
Qt的GraphicsView框架

         view从键盘和鼠标获取输入事件,并将它们翻译为scene事件(将坐标转换为scene坐标),再传递给可视的scene
         使用其转换矩阵,view::transform(),view可以转换scene的坐标系统。可以实现高级的导航特性,比如放大和旋转。为方便起见,QGraphicsView也可以在view和scene坐标之间转换:QGraphicsView::mapToScene()和QGraphicsView::mapFromScene()。
    
     Item
         QGraphicsItem是scene中graphical item的基类,Graphics View为几个特定类型提供了标准item,比如矩形(QGraphicsRectItem),椭圆(QGraphicsEllipseItem)和文本(QGraphicsTextItem),但你可以在自定义item时获取更丰富的QGraphicsItem特性。QGraphicsItem支持如下特性:
         鼠标按下,移动,释放和双击事件,鼠标hover事件,鼠标滑轮事件,和context menu事件
         键盘输入聚集和按键事件
         拖拽和drop
         Grouping(通过父子关系或QGraphicsItemGroup)
         碰撞检测
         items有本身的坐标系统,像QGraphicsView一样,它也提供很多在item和scene之间及item之间映射坐标的方法。像QGraphicsView一样,它也能使用矩阵转换坐标系统:QGraphicsItem::transform()。这对于旋转和缩放单个item很有用。
         items能够包含其他item,父item的transformation由其所有子item继承,尽管存在父元素的层层transformation,元素本身的方法如QGraphicsItem::contains(),QGraphicsItem::boundingRect()和QGraphicsItem::collidesWith()仍然使用本地坐标。
         QGraphicsItem支持通过QGraphicsItem::shape()和QGraphicsItem::collidesWith()方法进行碰撞检测,这两个方法都是虚方法。通过将item的形状以QPainterPath的形式从QGraphicsItem::shape()返回,QGraphicsItem可以为你处理所有碰撞检测。若要自定义冲突检测,可以重新实现QGraphicsItem::collidesWith()。

The Graphics View Coordinate System
      Graphics View是基于笛卡尔坐标系,item的位置和几何特性是由坐标表示的。在使用未经转换的view查看scene时,scene上的一个单位代表一像素。(注: Qt的Y坐标是向下的)
      在Graphics View中存在3种有效的坐标:item坐标,scene坐标和view坐标,为简化实现,Graphics View提供了在3种坐标之间转换的便利方法。
      渲染的过程中,Graphics View的scene坐标对应QPainter的逻辑坐标,而view坐标与设备坐标一致。在坐标系统文档中,可以看到逻辑坐标和设备坐标的关系。
 
    item 坐标系
   item 位于它们自己的本地坐标系中,通常这个坐标系是以原点0为中心的,且这也是所有transformation的中心,几何原语通常表示为item中的points,lines和rectangles。
   创建自定义item时,item坐标是你真正需要关心的。QGraphicsScene和QGraphicsView会为你做所有的transformation,这使得可以很容易地实现自定义item。比如,如果收到鼠标press或drag enter事件,事件位置是通过item坐标呈现的。QGraphicsItem::contain()这个虚函数在特定点位于item内时返回true,否则返回false。同样,item的bounding矩形和shape是在item坐标呈现的。
   item的position是item的center point在其父坐标系中的坐标,有时也引用为parent坐标。scene在这种情况下可视作所有parent-less item的“parent”,顶层item的位置由scene坐标系表示。
   子坐标系是相对于父坐标系的。如果子元素untransformed,则子坐标和父坐标与子坐标之间的差异是一样的。比如,若子元素位于父元素center point,则两坐标是完全一样的。若子元素位置是(10,0),则子元素中的坐标(0,10)对应父坐标的(10,10)
   由于item的位置和transformation是相对于parent的,子item的坐标是不受父item的transformation影响的,虽然父item的transformation隐式地transform了子元素。在上述例子中,就算parent旋转并放大,子item的(0,10)仍对应父item的(10,10)。然而相对于scene,child元素会follow父元素的transfromation和位置。若父元素放大2倍(2x,2x),则子元素位置为scene坐标的(20,0),且其(10,0)点将对应scene的(40,0)
     QGraphicsItem::pos()是几个例外之一,QGraphicsItem函数在item坐标中操作,不管item或其父元素的transformation。比如item的boundingRect总是通过item坐标给出(QGraphicsItem::boundingRect())

Scene Coordinates
     scene代表所有item的基坐标系,scene坐标系描绘了每个顶层item的位置,也形成了从view传递给scene的所有事件的基础。scene上的每个item都有一个scene坐标和bounding rectangle(QGraphicsItem::scenePos()和QGraphicsItem::sceneBoundingRect()),除了本地item pos和bounding rectangle。scene位置描绘了scene中的item坐标,且其scene的bounding rectangle形成了QGraphicsScene区分scene中哪些部分变化的基础。scene中的变化通过QGraphicsScene::changed()信号传播,参数是一系列scene矩形。

View Coordinates
     view坐标是widget坐标。view坐标中的第个单位对应一像素。这个坐标系特别的地方在于其是相对于widget,或viewport的,且不受其观察的scene的影响。QGraphicsView viewport左上角的总是(0,0),右下角是(viewport width,viewport height)。所有鼠标事件,拖拽和drop事件都最初是作为view坐标接收的,且你需要将这些坐标映射到scene以与items交互。

Coordinate Mapping
     处理scene中的item时,将坐标和任意形状从scene映射到item,item到item,view到scene会很有用。比如,当在QGraphicsView的viewport中点击鼠标时,可以通过调用QGraphicsView::mapToScene(),然后QGraphicsScene::itemAt(),以询问scene “光标下是什么item”。如果你想知道viewport中item位于什么地方,可以在item上调用QGraphicsItem::mapToScene(),然后在view上调用QGraphicsView::mapFromScene(),最后,如果想找出什么items位于view ellipse内,可以传递一个QPainterPath到mapToScene(),然后传递映射的路径到QGraphicsScene::items()。
     也可以将坐标和shapes映射到或from某item的scene,通过调用QGraphicsItem::mapToScene()和QGraphicsItem::mapFromScene()。也可以选择映射到父item,通过调用QGraphicsItem::mapToParent()及QGraphicsItem::mapFromParent(),或在item之间,调用QGraphicsItem::mapToItem()和QGraphicsItem::mapFromItem()。所有映射方法都能映射点,矩形,多边形和路径。
     同样的映射方法在view中也是可用的,不管是映射到还是from scene。QGraphcis::mapFromScene()和QGraphicsView::mapToScene()。为从view映射到item,您可以先映射到scene,然后从scene映射到item。

未完待续。。

http://blog.sina.com.cn/s/blog_5d29455e0101lkz0.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值