文章目录
QGraphicsScene 的简单理解–关于手册的简要翻译
简介:
QGraphicsScene 类提供了一个管理2D 图形一个操作平台。打个比方,QGraphicsScene 类类似一个舞台,各类的2D图形就是舞台中呈现的各个角色或者道具。
QGraphicsScene 类 常与QGraphicsView一起使用,因为QGraphicsView会提供视图。打个比方,就是观看舞台的取景框。常见的图形项,这里包括线条、矩形框、文本,甚至是自定义图形项等等。QGraphicsScene 类是raphics View Framework的一部分。
QGraphicsScene 类提供了一些操作方法,如:决定图形项是否可视,及坐标位置。
运用QGraphicsView 类,还可以缩放视图的方法来观看整个场景或者部分场景。
一个简单的例子:
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
QGraphicsScene是不能观看自身的。必须创建QGraphicsView 对象才可以看到场景中的图形项的。
一般操作:
一旦创建了场景,如果想添加图像项,怎么办?有两个选择:
1、通用方法:addItem()
2、其他便捷方法: addEllipse(), addLine(), addPath(), addPixmap(), addPolygon(), addRect(), or addText()等。 图像项的大小,可由上述函数来设定,该值是相对于图形项自身的坐标体系的。添加到场景的默认坐标是(0,0);
然后,就可以使用QGraphicsView来观看场景中的内容了。当场景发生变化时,(如图像项移动或者坐标发生改变时), QGraphicsScene会发送信号changed() 。删除图形项,可用removeItem().
QGraphicsScene 运用索引算法使得管理图形项的坐标变得高效。默认的BSP树是使用的,该算法是适合场景中多数图像项是静置的。
关于scene’s bounding rect:
1、通过setSceneRect() 设定
2、场景的大小默认是无限制的,图形项可以放置在场景中的任意一个位置。The scene rect 仅仅是用来记录、管理场景中的图形项的索引号的。
3、如果场景的rect 没有被设定,那么该rect的大小是包括所有图像项的最小rect , 可以通过itemsBoundingRect()来查看。但是这是比较耗时的,所以当需要操作较大的场景的时候,往往会预先设定场景的Rect。
the location of items.
QGraphicsScene 的其中一项强有力的能力在于它可以非常有效的决定涂香香的位置信息。甚至在拥有上百万个图像项的场景中,函数items() 能够决定图形项的位置在短短几个毫秒内。
items()函数的重载项由好多个:
1、查找图像项的位置。
2、查找图像项与多边形的相交等等
items()返回的是列表,最上层的是位于列表的第一项。为了便捷,itemAt()函数返回指定点最上面的图形项。
scene’s selection
QGraphicsScene 还支持图形项的选择功能。
1、设置选择:setSelectionArea(),
2、清除当前选择:clearSelection().
3、返回当前的选择: selectedItems()
事件处理与事件转播
QGraphicsScene 的另一个功能是转播来自QGraphicsView的事件。图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景传递给相应的图形项。
举个例子:
QApplication::sendEvent(). event()负责分发事件给各个图像项。对于一些常用的事件有一些便捷操作方法,如keyPressEvent()处理键盘事件。mousePressEvent().处理鼠标点击事件。
而对于键盘事件,它会传递给获得焦点的图形项,如果场景没有获得焦点,那么所有的键盘事件都会被丢弃。如果场景的setFocus()函数或者场景中的一个图形项获得了焦点,那么场景也会自动获得焦点。如果场景丢失了焦点(例如调用了clearFocus()函数),然而它的一个图形项获得有焦点,那么场景就会保存这个图形项的焦点信息,当场景重新获得焦点后,就会确保最后一个焦点项目重新获得焦点。
对于鼠标悬停,QGraphicsScene 会调度悬停事件。如果一个图形项可以接收悬停事件,那么当鼠标进入它的区域时,它会收到一个 GraphicsSceneHoverEnter事件。如果鼠标继续在图形项区域中进行移动,那么QGraphicsScene 会向该图形发送一个GraphicsSceneHoverMove事件。当鼠标离开图形项区域时,它将会收到GraphicsSceneHoverLeave 事件。
所有的鼠标事件都会传递到当前鼠标抓取的图形项。
总结:
场景的作用无非就是几下几点:
1、提供了用于管理大量图形项的接口。如添加图形项,删除图形项,查找图形项等。通俗点讲场景可以看做是一个舞台,或者容器。
2、传播事件给每一个图形项。
3、管理图形项的状态,例如选择和焦点处理。