QGraphicsScence类提供了一个管理大量2D图元的场景面。
这个类是作为QGraphicsItems的一个容器类, 它和QGraphicsView类一起使用,提供了图元可视化,例如线,矩形,文字,甚至是一些自定义的项,在一个2D的场景面上。QGraphicsScence是场景视图框架的一个部分。
QGraphicsScence也提供了功能,让你可以有效的确定item的位置,包括决定在场景的任意的地方是否可见等。和QGraphicsView 控件一起,你可以决定是否是整个场景可见,还是放大(zoom in)之后部分场景可见。
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
注意:QGraphicsScence本身没有可视的功能,它仅仅是能够管理items。你需要创建QGraphicsView 控件来可视化这个场景。
为了将item添加到场景中,你需要首先构造一个QGraphicsScence对象。然后,你有两个选择:要么通过调用addItem()添加已经存在的QGraphicsItem对象,或者你可以调用一些方便的接口:addEllipse(), addLine(), addPixmap(), addPolygon(), addRect(), addText(), 它都会返回一个指针,指向这些新添加的item.添加的这些item的维度尺寸是相对于item的坐标系统的,而且这些项的位置在场景中是初始化为(0,0)的。
然后你可以可视化这个场景通过QGraphicsView.当这个场景变化,(例如一个item移动或者转换)QGraphicsScence会发出changed()信号,通过调用removedItem()来移除一个item.
QGraphicsScence使用一个索引算法来高效的管理items的位置,通常默认使用BSP(Binary Space Partitioning)tree;一个适用大量场景的算法,通常他的大量items是保持静止的(也就是不移动的)。你可以通过调用setItemIndexMethod()来禁用掉索引。要了解更多的索引的算法,参见itemIndexMethod属性。
这个场景的外轮廓矩形通过调用setScenceRect()设置。Items可以放置在场景的任意位置,而且这个场景的位置默认是没有限制的,场景的rect 仅仅是用于内部的记录,保持场景的item的索引。如果这个场景的rect没有设置,QGraphicsScence将会使用包括所有item的轮廓区域,就像返回中的itemsBoundingRect(), 作为场景rect. 然而,itemsBoundingRect()是一个相对耗时的函数,因为任一个item的位置操作,都会需要他来重新收集每个item的位置信息,因此,一旦进行了大场景的操作,你就需要重新设置场景的rect.
QGraphicsScence的一个强大的功能之处在于它可以高效的管理item的位置,即使item的数量达到百万,items()函数可以在几毫秒内决定每个item的位置。这有好几个重载的items():
- 在固定的位置获取items;
- 在一个矩形或者多边形的位置周围查找items.