QGraphicsItem::boundingRect()是否应该包括子项的边界矩形?

8

通过搜索显示应该这样做。

但是dragdroprobot 示例实现(在父Robot对象上)则表明不应该这样做:

QRectF Robot::boundingRect() const
{
    return QRectF();
}

哪一个是正确的,或者还有更微妙的事情发生了吗?

拖放示例(机器人示例)已更新。链接在此处(2016年9月1日):http://doc.qt.io/qt-5/qtwidgets-graphicsview-dragdroprobot-example.html - mtb
3个回答

9

子项由场景直接绘制,而不是由父项绘制,并根据关于boundingRect()的文档:

QGraphicsView使用此方法来确定项是否需要重绘。

因此,如果父项没有绘制工作,则即使父项有子项,也无需返回非空的边界矩形。如果父项中有一些绘制工作,则只需要包含其自身的边界矩形即可。


好的,如果父级没有任何可绘制的内容,那么我可以返回空值:但是,如果我想通过在父级上设置可移动标志来允许所有子级一起移动,如果它没有边界矩形,那么鼠标事件永远不会触发它? - James
3
例如,你在父项中返回一个包含子项的形状或边界矩形,需要添加标识QGraphicsItem::ItemHasNoContents,并将子项堆叠在父项后面,这样父项就会在子项之前获取鼠标事件。 - alexisdm

1

可能相关:

  1. QGraphicItemGroup 是不同的。

文档说:

QGraphicsItemGroup 的 boundingRect() 函数返回项组中所有项的边界矩形。

(但是,文档没有说明 boundingRect 被重新实现了,尽管 QGraphicsItemGroup 继承了 QGraphicsItem。这可能是文档中的缺陷。)

  1. QGraphicItem.shape() 似乎类似于 boundingRect(),因为视图为每个实例调用它(用于选择,即 QGraphicsView.items(),类似于 boundingRect() 被调用以确定需要重新绘制什么)。

据我所知,QGraphicItemGroup.shape() 从未被 QGraphicsView.items() 调用。文档没有说明它被重新实现。


1

在正常使用情况下,您的QGraphicsItem的子项包含在其边界矩形内,但根据您的实现,我不认为这是必需的。

如果您需要一个项目子项的边界矩形,您可以简单地使用

QGraphicsItem::childrenBoundingRect();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接