gpt4 book ai didi

c++ - Qt:RemoveWidget和对象删除

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:05 29 4
gpt4 key购买 nike

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

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

例如,假设有一个有两个阶段的主窗口:第一个有大约 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
}

最佳答案

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

关于c++ - Qt:RemoveWidget和对象删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599273/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com