QGraphicsItem::boundingRect()是否包含子边界rect ?

Should QGraphicsItem::boundingRect() include child bounding rects?

本文关键字:边界 包含 rect 是否 boundingRect QGraphicsItem      更新时间:2023-10-16

谷歌显示应该是。

但是dragdroprobot示例实现(在父Robot对象上)建议不要:

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

哪个是正确的,还是有更微妙的事情在发生?

子元素由场景直接绘制,而不是父元素,并且根据boundingRect()的文档:

QGraphicsView使用它来确定项目是否需要重绘。

所以,如果在父元素中没有绘图要做,就不需要返回一个非空的边界矩形,即使父元素有子元素。如果父元素中有绘图,它只需要包含自己的边界矩形

在正常情况下,QGraphicsItem的子元素被包含在它的边界矩形中,但根据您的实现,我认为这是不需要的。

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

QGraphicsItem::childrenBoundingRect();

可能相关:

  1. QGraphicItemGroup则不同。

文档说:

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

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

  • QGraphicItem.shape()似乎与boundingRect()相似,因为视图在每个实例中调用它(为了选择QGraphicsView.items(),类似于boundingRect()被调用以确定需要重新绘制的内容)。
  • 据我所知,QGraphicItemGroup.shape()从未被QGraphicsView.items()调用过。文档没有说它被重新实现。