【问题标题】:Should QGraphicsItem::boundingRect() include child bounding rects?QGraphicsItem::boundingRect() 是否应该包含子边界矩形?
【发布时间】:2011-09-16 17:27:07
【问题描述】:

谷歌搜索suggests that it should

但 dragdropprobot example implementation(在父 Robot 对象上)建议不要:

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

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

【问题讨论】:

  • 对拖放示例的更新(机器人示例)。链接在这里(2016 年 9 月 1 日):doc.qt.io/qt-5/…

标签: c++ qt qgraphicsscene


【解决方案1】:

子项直接由场景而不是父项绘制,根据the documentation about boundingRect()

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

因此,如果父项中没有绘制,则无需返回非空边界矩形,即使父项有子项。 而如果父级中有一些绘图,它只需要包含自己的边界矩形即可。

【讨论】:

  • 好吧,如果父级没有什么可画的,扩展我什么都不能返回:但是如果我想通过在父级上设置可移动标志来允许所有子级一起移动怎么办 - - 如果它没有边界矩形,那么鼠标事件永远不会击中它?
  • 然后,例如,在父级中返回包含子级的形状或边界矩形,添加标志 QGraphicsItem::ItemHasNoContents 并将子级堆叠在父级后面,以便父级获得鼠标事件在孩子们面前。
【解决方案2】:

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

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

QGraphicsItem::childrenBoundingRect();

【讨论】:

    【解决方案3】:

    可能相关:

    1. QGraphicItemGroup 不同。

    文档说:

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

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

    1. QGraphicItem.shape() 似乎与 boundingRect() 相似,因为视图为每个实例调用它(用于选择,即QGraphicsView.items(),类似于调用boundingRect() 以确定需要重绘的内容)。李>

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      相关资源
      最近更新 更多