Qt Parent在孩子关闭后删除变量

时间:2016-11-06 00:48:09

标签: c++ qt signals slot

我正在使用Qt库在C ++中编写应用程序。有一个中央窗口(父级),所有孩子都在需要时启动。由于这些窗口可以多次打开,但显示不同的数据,我用new声明对象。这是我所拥有的一个例子:

Home_Window.hpp

View_Window *SomeWindow;

Home_Window.cpp

void Home_Window::on_WindowButton_clicked()
{
    SomeWindow = new View_Window();
    SomeWindow->show();
}

我想要做的是,当窗口关闭时删除对象以减少应用程序的内存占用。我已经能够删除子窗口中包含的所有对象以减少内存使用量,但核心对象仍然存在,如果用户打开并关闭1000个窗口,并且每个对象都保留一天40-50KB的内存,应用程序的占用空间从几MB的内存到100的MB内存。

我无法在网上找到能让我实现这一目标的指南。我正在考虑一个插槽和信号对,因为我知道当窗口关闭时,它会发送QObject::destroyed()信号。唯一的问题是,我没有尝试像这样设置信号和插槽对。

任何建议都表示赞赏。

3 个答案:

答案 0 :(得分:3)

要删除closed时的窗口,您可以在其上设置WA_DeleteOnClose属性。您的on_WindowButton_clicked()应该类似于:

void Home_Window::on_WindowButton_clicked()
{
    View_Window* w= new View_Window();
    w->setAttribute(WA_DeleteOnClose);
    w->show();
}

通过这种方式,您无需担心自己会w销毁,但会在关闭时自动delete

答案 1 :(得分:1)

你需要做两件事:

  1. 即使窗口未关闭,也必须管理窗口的生命周期。

    你可以给它一个你知道会在某个时候结束生命的父母。或者您可以使用QScopedPointerstd::unique_ptr

  2. 窗口必须在关闭时自行删除。

  3. void Home_Window::on_WindowButton_clicked()
    {
        //                           parent window flags    
        //                            vvvv  vvvvvvvvvv
        auto window = new View_Window(this, Qt::Dialog);  /* 1. */
        window->setAttribute(Qt::WA_DeleteOnClose);       /* 2. */
        window->show();
    }
    

    至少,您应该设置Qt::Window标志。 Qt::Dialog包含Qt::Window标志,并且还将窗口声明为对话框 - 该事实具有特定于平台的解释;阅读有关窗口标志here的更多信息。

    如果您的View_Window的API被破坏,并且它没有将窗口标志作为构造函数的第二个参数,则需要单独设置它们:

    window->setWindowFlags(Qt::Dialog);
    

    每个小部件都应该将Qt::WindowFlags作为构造函数的可选第二个参数,其默认值反映了窗口的常用用法。这是所有Qt小部件设定的期望。

答案 2 :(得分:0)

您可以尝试使用:ViewWindow

删除指向delete SomeWindow;的指针