Qt:RemoveWidget和对象删除

时间:2012-07-22 09:54:01

标签: c++ qt qwidget removechild qobject

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

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

例如,假设有一个主窗口有两个阶段:第一个有大约100个对象从一个父级嵌入,另一个有200个。应用程序从第1阶段开始,然后移到第2阶段,它将永远不会返回如果我希望这有点高效,我会尝试杀死第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
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

  

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

取自here

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