详解 QT 中Graphics View柜架 (上篇)

移动开发
Graphics View使用BSP树来提供对item的快速查找,使用这种技术,它可以实时地绘制大规模场景,甚至以百万items计。Graphics View在Qt 4.2中被引用,它替代了它的前辈QCanvas。

 QTGraphics View柜架是本文要介绍的内容,本文分为三部分为大家介绍,本篇文章为上篇,想要继续深入了解的请继续关注。参考末尾。先来看本节内容。

Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放。这个柜架也包含一个事件传播结构,对于在scene中的这些items,它具有双精度的交互能力。Items能处理键盘事件,鼠标的按,移动、释放、双击事件,也可以跟踪鼠标移动。Graphics View使用BSP树来提供对item的快速查找,使用这种技术,它可以实时地绘制大规模场景,甚至以百万items计。Graphics ViewQt 4.2中被引用,它替代了它的前辈QCanvas。

Graphics View的体系结构

Graphics View提供的是一种类似于Qt model-view的编程。多个views可以监视同一个场景,而场景包含多个具有多种几何外形的items。

场景

QGraphicsScene 表示Graphics View中的场景,它有以下职责:

为管理大量的items提供一个快速的接口。

传播事件到每个item。

管理item的状态,例如选择,焦点处理。

提供未经变换的渲染功能,主要用于打印。

场景作为QGraphicsItem对象的容器。通过调用QgraphicsScene::addItem()把这些Items加入到场景中。可以使用众多的查找函数来获取特定的items。QGraphicsScene:items()与它的许多重载函数可获取那些与点、矩形,多边形,向量路径等相交或是有包含有关系的items。QGraphicsScene::itemAt()返回特定上最顶端的item。所有的item查找函数都以出栈序列返回(也就是说,***个返回的是最顶端的,***一个返回的是***端的)。

  1. QGraphicsScene  scene;  
  2. QGraphicsRectItem  *rect=scene.addRect(QRectF(0,0,100,100));  
  3. QGraphicsItem  *item=scene.itemAt(50,50);  
  4. //item==rect; 

QGraphicsScene的事件传播结构会把场景事件投递到items,也管理多个items之间的传递。假如场景收到了鼠标在某个位置press事件,场景会把这个事件投递给处在那个位置的item。QGraphicsScene也管理某种item状态,像选择与焦点。你可以通过调用QGraphicsScene::setSelectionArea()来选择items,它需要提供一个任意的形状为参数。这个函数也作为在QGraphicsView实现橡皮筋选择功能的一个基础。为得到这些已经被选择的items,调用QGraphicsScene::selectedItem()。另一个状态处理是是否一个item拥有键盘输入焦点。你可以调用QGraphicsScene::setFocusItem()或QGraphics::setFocus()来设定焦点,也可用

QGraphicsScene::focusItem()来得到当前拥有焦点的那个item。***,QGraphicsScene允许你通过调用QGraphicsScene::render()函数把部分场景送到绘图设备进行渲染。

视图

QGraphicsView提供了视图部件,它可视化场景中的内容。你可以联结多个视图到同一个场景,对这个相同的数据集提供几个视口。视口部件是一个滚动区域,它提供了滚动条以对大场景进行浏览。为了使用OpenGL,你应该调用QGraphicsView::setViewport()来把一个QGLWidget设为视口。视图从键盘,鼠标接收输入事件,在发送这些事件到场景之前,会对这些事件进行适当的翻译(把事件坐标转换成对应的场景坐标)。
利用转换矩阵,QGraphicsView::matrix(),视图可变换场景的坐标系统。这允许高级的导航特性,如缩放,旋转。为了方便,QGraphicsView也提供了在视图与场景之间进行坐标转换的函数:QGraphicsView::mapToScene(),QGraphicsView::mapForScene()。

详解 QT 中Graphics View柜架 (上篇)

The Item

QGraphicsItem 是场景中图形items的基类。Graphics View 提供了一些标准的、用于典型形状的items。像矩形(QGraphicsRectItem),椭圆(QGraphicsEllipseItem),文本(QGraphicsTextItem),当你写定制的item时,那些最有用的一些QGraphicsItem特性也是有效的。除此这外,QGraphicsItem支持以下特性:

*鼠标按、移动、释放、双击事件,鼠标悬停事件,滚轮事件,弹出菜单事件。

*键盘输入焦点,键盘事件。

*拖拽

*组,包括父子关系,使用QGraphicsItemGroup

*碰撞检测

Items如同QGraphicsView一样,位于本地坐标系,它也为item与场景之间,item与item之间的坐标转换提供许多工具函数。而且,也像QGraphicsView一样,它使用矩阵来变换它的坐标系统:QGraphicsItem::matrix()。它对旋转与缩放单个的Item比较有用。

Items可以包含别的items(孩子)。父items的转换被它的子孙所继承。然而,它的所有函数(也就是,QGraphicsItem::contains(),QGraphicsItem::boundingRect(),QGraphicsItem::collidesWith()),不会积累这些转换,依然在本地坐标下工作。

QGraphicsItem通过QGraphicsItem::shape(),QGraphicsItem::collideWith())来支持碰撞检测。这两个都是虚函数。从shape()返回你的item的形状(以本地坐标QPainterPath表示),QGraphicsItem会为你处理所有的碰撞检测。假如你想提供自己的碰撞检测,你应该重新实现QGraphicsItem::collideWith()。

小结:关于详解 QTGraphics View柜架 (上篇)的内容介绍完了,希望本文对你有所帮助。请继续关注 详解 QT 中Graphics View柜架 (中篇)

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-30 10:36:07

QT Graphics View

2011-06-30 10:22:48

QT Graphics View

2011-07-05 18:32:52

QT 信号 机制

2011-06-24 16:41:14

QT OpenCV 框架

2011-06-23 16:24:21

Qt Embedded 交叉编译

2011-07-01 14:14:34

Qt 事件

2011-06-14 11:48:38

Webkit QT

2011-06-24 11:03:31

Qt 多线程 线程

2011-06-17 16:47:12

Qt Eclipse Windows

2011-06-17 13:18:17

Qt 文件

2011-06-24 09:13:30

QT SDL

2011-06-22 14:30:44

QT 多线程 线程

2011-06-27 13:32:21

Qt 数据库 QSqlQueryM

2011-06-30 15:51:39

2011-06-24 14:17:58

Qt 容器类 QVector

2011-06-24 15:16:33

Qt 插件

2011-06-24 09:22:54

QT .pro文件 qmake

2011-06-29 17:20:20

Qt 内存 QOBJECT

2011-06-28 15:18:45

Qt 单例模式

2011-06-21 15:48:41

点赞
收藏

51CTO技术栈公众号