Qt Parent 在 child 关闭后删除变量

Qt Parent to delete variable after child has closed

我正在使用 Qt 库用 C++ 编写应用程序。有一个中央 window (parent) 和所有 children 在需要时启动。由于其中一些 windows 可以多次打开,但显示不同的数据,因此我将 object 声明为 new。这是我得到的示例:

Home_Window.hpp

View_Window *SomeWindow;

Home_Window.cpp

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

我想做的是在 window 关闭时删除 object,以减少应用程序的内存占用。我已经能够删除 child window 中包含的所有 object 以减少内存使用,但核心 object 仍然存在,如果通过一天,用户打开和关闭 1000 个 windows,并且每个 object 占用 40-50KB 的内存,应用程序的内存占用从几 MB 变为 100 MB 的内存.

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

如有任何建议,我们将不胜感激。

删除window当它是closed, you can set the WA_DeleteOnClose属性就可以了。您的 on_WindowButton_clicked() 应该类似于:

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

这样就不用担心自己破坏w了,关闭的时候会自动得到deleted。

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

你需要做两件事:

  1. 即使 window 没有关闭,也必须管理 window 的生命周期。

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

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

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 标志,并且还声明 window 是一个对话框 - 这个事实有 platform-specific 解释;阅读更多关于 window 标志 here.

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

window->setWindowFlags(Qt::Dialog);

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