Qt父级在子级关闭后删除变量

Qt Parent to delete variable after child has closed

本文关键字:删除 变量 Qt      更新时间:2023-10-16

我正在使用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()信号。唯一的问题是,我没有尝试像这样设置信号和插槽对。

要在窗口关闭时删除窗口,可以在窗口上设置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 d。

您需要做两件事:

  1. 即使窗口没有关闭,也必须管理窗口的生存期。

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

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

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标志,并且还声明该窗口为对话框——这一事实具有特定于平台的解释;点击这里了解更多关于窗口标志的信息。

如果你的View_Window的API坏了,它不把窗口标志作为构造函数的第二个参数,你需要分别设置它们:

window->setWindowFlags(Qt::Dialog);

每个小部件都应该将Qt::WindowFlags作为构造函数的第二个可选参数,并使用反映窗口通常使用的默认值。

您可以尝试使用以下命令删除指向ViewWindow的指针:delete SomeWindow;