【问题标题】:Qt what happens to QGraphicsItems when added to QGraphicsLinearLayoutQt 添加到 QGraphicsLinearLayout 时 QGraphicsItems 会发生什么
【发布时间】:2017-03-18 12:41:23
【问题描述】:

我有一个指向 QGraphicsItems 的指针向量,它们都已添加到 QGraphicsLinearLayout。

我担心内存管理。

1) 当我添加它们时会发生什么? 他们是自动获得父级还是我需要显式调用 item.setParentLayoutItem(layout)?

2) 如果他们是父母,Qt 会处理他们的删除吗? (当父级被删除时)

3) 我还有一个 remove 方法,可以从我的向量和布局中删除项目。我应该在删除之前从布局中删除它/调用 vector.erase(...)... 还是这取决于我是否有父母?

【问题讨论】:

    标签: c++ qt qgraphicsitem


    【解决方案1】:

    1) 当我添加它们时会发生什么?他们是自动成为父母还是 我需要显式调用 item.setParentLayoutItem(layout) 吗?

    来自 qt 文档:

    如果项目同时继承了 QGraphicsItem 和 QGraphicsLayoutItem(例如 正如 QGraphicsWidget 所做的那样)该项目实际上是两个所有权的一部分 层次结构。该属性通知布局应该如何处理它的 销毁时的子项。在 QGraphicsWidget 的情况下,它 最好在删除布局时不会删除其 子项(因为它们也是图形项层次结构的一部分)。

    ownedByLayoutsetOwnedByLayout

    理论上它们是,但您可以使用上面两个链接提供的文档参数化删除。

    2) 如果它们是父对象,Qt 会处理它们的删除吗?

    是的

    3) 我还有一个 remove 方法,可以从我的向量中删除项目 和布局。我应该先从布局中删除该项目吗 删除它/调用 vector.erase(...)... 还是这取决于 我是否为人父母?

    如果您的QGraphicsLayoutItem 拥有(父/子关系)您所有的QGraphicsItem,则在删除父级时它们都将被删除。

    如果你想删除单个元素,那么一个简单的调用:

    theItemYouWantToDelete->deleteLater()
    

    应该够了。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 2017-11-27
      • 2020-01-08
      • 2016-12-11
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多