Qt学习笔记-----Graphics_View_Framework

来源:互联网 发布:复刻supreme的淘宝 编辑:程序博客网 时间:2024/06/15 09:04

Graphics View框架中三个重要的类:QGraphicsScene, QGraphicsView,  QGraphicsItem。

Scene提供了图形视图场景,它是整个框架的基础,负责以下四个事情:

1.为了管理大量元素item,它提供了一个快速的接口

2.传播事件给每一个元素item

3.管理元素item状态,例如选择和焦点处理

4.提供原生的渲染功能,主要用于绘图。

Scene场景充当一个QGraphicsItem对象,可以使用addItem()函数将元素item添加到场景中,场景负责管理添加到自身的元素,比如传播事件等。可以把Scene想象成一个管理器,统一管理它旗下的元素item。


View视图主要作为场景中的视图组件,它将场景中的内容展现在我们的眼前。同时它还负责接收来自键盘和鼠标的输入事件,然后将事件转换成场景事件然后传播给Scene。


Item元素是场景中基础组件,它被添加到场景中,然后被View视图显示出来。描述元素主要利用一些属性,

shape()函数返回元素的轮廓图,如果我们定义了一个类继承QGraphicsItem,那么我们就需要实现shape()函数返回这个类表示的元素的轮廓图(为了画出一个东西,首先当然要知道它的轮廓图,或者说形状是什么样子嘛,不然谁知道怎么画。。。)。shape()函数返回的是QPainterPath类型,用于表示外围轮廓。

boundingRect()函数则返回包围元素的最小矩形,用于Scene判断哪个区域发生了改变。

此外,QGraphicsItem类自带碰撞检测,这就为元素之间的相互作用提供了很大的方便。因为我们每创建一个元素,就需要使用addItem函数将其添加到Scene中,所以就可以使用QGraphicsItem::collidesWith()函数来返回所有在Scene中与该元素发生碰撞的元素。


除此之外,就是三者的坐标系统,一旦决定使用Graphics View框架,就注定要与三者的坐标变换奋斗。

首先考虑元素的坐标系统,Item Coordinates:

元素的坐标系统(坐标系)是以元素为原点绘制的,也就是说通常元素的位置都是坐标原点(0, 0),前面说的bounding rect 和shape都是在元素坐标系统中确定的。而我们通常说的元素位置坐标,是在场景Scene坐标系中定义的。

打个比方,元素坐标为(10, 0),那么它在Scene中的坐标就是(10, 0)。然后又给出在元素中的坐标(0, 10),那么在Scene中,这个坐标就是(10, 10)。


场景的坐标系统,Scene Coordinates:

场景坐标系主要用于描述元素的位置。正如前面说的元素坐标其实是在场景坐标系中确定的。


视图的坐标系统,View Cooridinates:

视图的坐标系总是以视图的左上角为原点,右下角的坐标总是(width, height)。所有的鼠标事件和拖放事件的坐标都是在视图坐标系中给定的。所以需要我们将这个坐标转换成场景坐标来响应元素。


接下来是坐标变换,Coordinate Mapping:

通常在处理场景中的元素时,我们需要将坐标或者将几何图形从场景坐标转换到元素坐标系下,或者从一个元素坐标系转换到另一个元素坐标系,再或者是从视图坐标系转换到场景坐标系中。

比如说,我们想知道鼠标点击的这个位置是场景中的哪个元素。就需要先将视图坐标系下的坐标转换成场景坐标系下的坐标,在通过QGraphicsScene::itemAt()函数来找到这个位置的元素。

再比如说,我们想知道一个元素在视图中什么地方。就需要先将元素坐标系下的坐标转换成场景坐标系下的坐标,然后再从场景坐标系下的坐标转换成视图坐标系下的坐标。

Qt提供了mapToScene函数用于将元素坐标系下的坐标或者视图坐标系下的坐标转换成场景坐标,QGraphicsItem和QGraphicsView中都有这个函数。

mapFromScene()函数用于将场景坐标系下的坐标转换成元素坐标系下的坐标或者视图坐标系下的坐标,Item和View也都有这个函数。


0 0
原创粉丝点击