QGraphicsScence Qt场景类

来源:互联网 发布:php 随机红包算法 编辑:程序博客网 时间:2024/05/17 22:26

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():

  1. 在固定的位置获取items;
  2. 在一个矩形或者多边形的位置周围查找items.
返回的items的列表按照顺序堆排序,最上面的是列表中的第一个item。为了方便起见,还有一个itemAt()函数返回给定位置的最顶层的item。

通过调用setSelectionArea()来选择items, 通过clearSelection()来清除所有的选择,调用selectedItems()类获取所有选择的items的列表。

Event Handling and Propagation(事件的处理和传播)

QGraphicsScence的另外一个功能,就是传播来自QGraphicsView的事件,为了传递事件给场景,你需要构造继承自QEvent的事件,然后在使用的时候发送事件,例如:QApplication::sendEvent()。 event()就是分离各自的事件。一些共同的事件可以通过方便的事件句柄来处理。例如: key 的按下事件被keyPressEvent()句柄来处理,mouse的按下事件被mousePressEvent()来处理。
按键的事件将被传递给获取到焦点的item。为了使item获取焦点,你可以通过调用setFocusItem()让一个item接受焦点,或者item本身通过QGraphicsItem::setFocus()来获取,或者通过focusItem()来获取当前有焦点的item.为了使窗口部件兼容,这个场景同样有自己的焦点信息。默认情况下,场景没有焦点,所有的按键事件也丢弃了。如果setFocus()被调用了或者场景中的一个item获取到了焦点,这个场景就会自动获取到焦点,如果这个场景有焦点,hasFocus()将会返回true, 同时,如果有键盘事件的话,item都将会捕捉到。



0 0
原创粉丝点击