我一直在阅读 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
}