2

我一直在阅读 Qt 文档并使用 qobject 树。我想知道是否有一种方法可以从树中删除小部件,从而将它们从内存中删除。

当相互嵌入 qwidgets/qobjects 并创建树时,从 qlayouts 中删除带有 removeWidget 的小部件将在 gui 中可视地删除它们,但是该对象仍保持连接到父 qobject(object->parent() 不是 0),只有在删除其父级(例如超出范围)后才会删除它。我只能看到一个 qwidget 只有在应用程序终止时才能被销毁,其中顶部小部件将其下面的所有内容(或者如果对象超出范围)。

例如,假设有一个具有 2 个阶段的主窗口:第一个具有从一个父级嵌入的大约 100 个对象,另一个具有 200 个。应用程序从第 1 阶段开始并移动到第 2 阶段,它永远不会回到第 1 阶段. 如果我想让这有点效率,我会尝试杀死阶段 1 中的所有对象(100 个对象),但是因为它们附加到主窗口的根节点,即使使用“removeWidget”也无法销毁它。

我还尝试接收在没有“new”运算符的情况下创建的小部件的指针,如果我删除该对象,应用程序将崩溃,因为它会调用析构函数两次。

我的问题是,有没有办法删除 qobject 树中的节点(该节点没有被删除,因为它超出范围或应用程序终止时)?

对不起,如果这没有多大意义。提前致谢。

编辑:

对不起,如果我给出了错误的想法。我的问题是在应用程序终止之前或对象超出范围之前从内存中删除一个节点。这是一个例子(可能不是那么好)。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Test w;
    w.show();

    QHBoxLayout *layout = new QHBoxLayout();
    w.setLayout(layout);

    Test heavyObj;             //I know you can use pointers instead and that 
                               //would allow you to easy delete the object
                               //but say if I did this instead.
    w->addWidget(&heavyObj);

    for(int i=0; i < 200; i++) {
        Test obj(heavyObj);
    }

    w->removeWidget(&heavyObj); //At this point we don't want "heavyObj", I want
                                //to delete this object from memory
                                // is it possible to remove p1 from memory?

    return a.exec();

    //As stated, once the program terminates everything is destroyed
}
4

2 回答 2

3

调用 removeWidget() 后,用 . 删除对象delete yourWidgetPointer;。QObject 的析构函数将负责从父级注销子级。

于 2012-07-22T10:13:07.310 回答
0

当 QObjects 在堆上创建(即用 new 创建)时,可以以任何顺序从它们构造树,然后,可以以任何顺序销毁树中的对象。当树中的任何 QObject 被删除时,如果该对象有父对象,则析构函数会自动从其父对象中删除该对象。如果对象有子对象,析构函数会自动删除每个子对象。没有 QObject 被删除两次,无论销毁顺序如何。

取自这里

我不知道你在问什么,如果你删除一个对象,它会从它的父级中删除,然后删除它拥有的所有子级(这会从你正在删除的内容中向下级联子树)。请显示您正在调用的导致段错误的代码,因为您应该能够在树中的任何点删除(使用delete)any QObject,并且树将自行重组。

于 2012-07-22T10:06:52.157 回答