【Qt图形视图框架】QGraphicsScene分析

本文详细介绍了Qt中QGraphicsScene类,它是图形视图框架一部分,用于管理大量2D图形项。阐述了其使用方法,如添加、删除项,设置场景矩形等,还介绍了属性方法、成员方法、公共槽函数、信号及事件处理等内容,帮助开发者更好地运用该类。

描述

QGraphicsScene类提供了一个用于管理大量2D图形项的表面。
该类充当QGraphicsItems的容器。它与QGraphicsView一起用于在2D表面上可视化图形项,如线条、矩形、文本,甚至自定义项。QGraphicsScene是图形视图框架的一部分。
QGraphicsScene还提供了一些功能,可以让您有效地确定项目的位置,并确定在场景的任意区域内哪些项目是可见的。使用QGraphicsView小部件,您可以可视化整个场景,也可以放大并仅查看场景的一部分。
该类继承自QObject,于Qt4.2版本引入
使用:

#include <QGraphicsScene>

注意

请注意,QGraphicsScene本身没有可视外观,它只管理item。您需要创建一个QGraphicsView小部件来可视化场景。
要向场景添加item,首先构造一个QGraphicsScene对象。然后,您有两个选项:通过调用addItem()添加现有的QGraphicsItem对象,或者可以调用方便函数addEllipse()、addLine()、addPath()、addPixmap()、addPolygon()、addRect()或addText(),它们都返回一个指向新添加项的指针。使用这些函数添加的项的尺寸相对于项的坐标系统,并且项的位置在场景中初始化为(0,0)。
然后,您可以使用QGraphicsView可视化场景。当场景发生变化时(例如,当item移动或转换时),QGraphicsScene发出changed()信号。要删除一个item,调用removeItem()。
QGraphicsScene使用索引算法来高效地管理item的位置。默认情况下,使用BSP(二进制空间分区)树;这是一种适用于大场景的算法,其中大多数item保持静态(即不移动)。您可以通过调用setItemIndexMethod()选择禁用此索引。有关可用的索引算法的更多信息,请参见itemIndexMethod属性。
通过调用setSceneRect()来设置场景的边界矩形。item可以放置在场景上的任何位置,默认情况下,场景的大小是无限的。场景矩形仅用于内部记账,维护场景的item索引。如果未设置场景矩形,QGraphicsScene将使用所有item的边界区域(由itemsBoundingRect()返回)作为场景矩形。然而,itemsBoundingRect()是一个相对耗时的函数,因为它通过收集场景上每个item的位置信息来操作。因此,在操作大场景时,您应始终设置场景矩形。
QGraphicsScene最大的优势之一是其能够高效地确定item的位置。即使场景上有数百万个item,items()函数也可以在几毫秒内确定item的位置。items()有几个重载版本:一个在特定位置找到item的函数,一个在多边形或矩形内或相交的函数等等。返回的item列表按堆叠顺序排序,最上面的item在列表中排在第一个。为了方便起见,还有一个itemAt()函数,它返回给定位置的最上面的item。
QGraphicsScene维护场景的选择信息。要选择item,请调用setSelectionArea(),要清除当前选择,请调用clearSelection()。调用selectedItems()以获取所有选中的item的列表。

事件处理和传播

QGraphicsScene的另一个职责是传播来自QGraphicsView的事件。要将事件发送到场景,需要构造一个继承QEvent的事件,然后使用(例如QApplication::sendEvent())发送它。Event()负责将事件分派给各个项目。一些常见事件由便利事件处理程序处理。例如,按键事件由keyPressEvent()处理,鼠标按键事件由mousePressEvent()处理。

将关键事件传递给焦点项。要设置焦点项,您可以调用setFocusItem(),传递一个接受焦点的项,或者项目本身可以调用QGraphicsItem::setFocus()。调用focusItem()来获取当前的焦点项。为了与小部件兼容,场景还维护自己的焦点信息。默认情况下,场景没有焦点,所有关键事件都被丢弃。如果调用setFocus(),或者场景上的一个项目获得焦点,则场景自动获得焦点。如果场景有焦点,hasFocus()将返回true,关键事件将被转发到焦点项(如果有的话)。如果场景失去焦点,(例如,有人调用clearFocus())当一个项目有焦点时,场景将保持它的项目焦点信息,一旦场景恢复焦点,它将确保最后一个焦点项目恢复焦点。

对于鼠标悬停效果,QGraphicsScene调度悬停事件。如果一个项目接受悬停事件(参见QGraphicsItem::acceptHoverEvents()),当鼠标进入其区域时,它将接收GraphicsSceneHoverEnter事件。当鼠标继续在项目区域内移动时,QGraphicsScene将向它发送GraphicsSceneHoverMove事件。当鼠标离开项目所在区域时,该项目将接收一个GraphicsSceneHoverLeave事件。

所有鼠标事件都传递给当前的鼠标抓取项。如果一个项目接受鼠标事件(参见QGraphicsItem::acceptedMouseButtons()),并且接收到鼠标按下,它就会成为场景的鼠标抓取器。在没有按下其他鼠标按钮时,它将保持鼠标抓取器状态,直到收到鼠标释放。您可以调用mouseGrabberItem()来确定当前正在抓取鼠标的项目。

使用示例

示例:

QGraphicsScene scene;
scene.addText("Hello, world!");

QGraphicsView view(&scene);
view.show();

属性方法

backgroundBrush: QBrush

该属性保存场景的背景画刷。
通过设置该属性,可以将场景的背景更改为不同的颜色、渐变或纹理。默认的背景画刷是Qt::NoBrush。背景在物品之前(背后)绘制。
示例:

QGraphicsScene scene;
QGraphicsView view(&scene);
view.show();

// 一个蓝色的背景
scene.setBackgroundBrush(Qt::blue);

// 一个渐变背景
QRadialGradient gradient(0, 0, 10);
gradient.setSpread(QGradient::RepeatSpread);
scene.setBackgroundBrush(gradient);

QGraphicsScene::render() 调用 drawBackground() 来绘制场景的背景。为了更详细地控制背景的绘制,可以在 QGraphicsScene 的子类中重新实现 drawBackground()。
关联函数:

QBrush backgroundBrush() const
void setBackgroundBrush(const QBrush &brush)

bspTreeDepth: in

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值