【问题标题】:How to delete all the children of a Qt window?如何删除 Qt 窗口的所有子窗口?
【发布时间】:2011-11-22 15:18:35
【问题描述】:

我有一个主窗口,可以在其中动态创建对象,因此在创建任何新屏幕之前,我必须首先从最后一个屏幕中删除所有对象。我正在使用它,效果很好:

qDeleteAll(this->window->findChildren<QWidget*>());

但现在我的屏幕上有一些 QGraphicsViewQGraphicsScene,我也将它们的父窗口设为主窗口,现在当我尝试删除主窗口的所有子窗口时出现崩溃。

所以我的问题基本上是,我怎样才能避免这种崩溃?如何轻松安全地删除所有主窗口的子窗口,包括 GraphicsSceneGraphicsView

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    我怀疑您的崩溃是由双重删除引起的。

    QObject 的父/子关系使得如果父被删除,它的子也被删除。因此,如果您想删除一个小部件及其所有后代,那么您需要做的就是删除父小部件。

    在您的情况下,我可能会确保所有动态创建的小部件都属于某种容器小部件/框架,然后删除它,然后重新创建它。

    【讨论】:

    • 你的意思是“后裔”吗?不过,不确定是否需要删除 Qt 小部件。它们是引用计数的,所以如果你重复使用一个或多个,保留它们的成本很低。
    • QObjects 在删除时会删除它们的子对象,但 QObject 系统中没有内置引用计数。确保正确管理内存仍然取决于程序员,这只会让它变得容易得多。
    • 这很好用,我刚刚创建了一个 QWidget 用作所有对象的父级,并将主窗口设置为这个新 QWidget 的父级,然后我将其删除以删除所有对象.你们能多谈谈这个内存问题吗?我应该做些什么来保证我不会耗尽内存吗?我的程序是在嵌入式系统中运行的,所以内存管理非常重要!谢谢。
    • 从 QObject/QWidget 方面你应该没问题。如果您想更加偏执,您可以随时连接到 QObject::destroyed() 信号并验证您的小部件是否被删除。
    • @chris - 一些 QObjects 被引用计数,或者被 Trolls 称为隐式共享。见doc.qt.nokia.com/4.6/implicit-sharing.html