如何获得可见的项目边界框?

How to get visible items bounding-box?

我有一个包含许多 QGraphicsItem 项(大约 25000 项)的场景,当我隐藏无用的项时,如何获取所有可见项的边界框,以便我可以使用 fitInView 确保项目在视图中心可见。

我的场景

想要获取可见项目边界框

我认为没有任何功能可以限制只获取可见项目的矩形。我会使用蛮力,遍历所有可见项目并计算总边界矩形。例如,在此处查看 QGraphicsScene::itemsBoundingRect() 的实现 https://code.woboq.org/qt5/qtbase/src/widgets/graphicsview/qgraphicsscene.cpp.html#_ZNK14QGraphicsScene17itemsBoundingRectEv 并为其添加可见性检查。

QRectF visibleItemsBoundingRect() const
{
    QRectF boundingRect;
    const auto items_ = items();
    for (QGraphicsItem *item : items_)
    {
        if (item->isVisible()) // Note: this line was added to original implementation
            boundingRect |= item->sceneBoundingRect();
    }
    return boundingRect;
}

如果由于大量不可见项导致这种蛮力性能不令人满意,那么您可能应该在某处保留一些仅可见项的列表,但您需要注意维护它并在每次显示或更新时更新它隐藏或添加或删除场景中的任何内容。然后,您可以更快地迭代如此小的项目列表。但除非暴力法性能真的很差,否则我不会走这条路。