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
了,关闭的时候会自动得到delete
d。
您可以尝试使用以下方法删除指向 ViewWindow
的指针:delete SomeWindow;
你需要做两件事:
即使 window 没有关闭,也必须管理 window 的生命周期。
您可以给它一个 parent,您知道它会在某个时候结束它的生命。或者您可以使用 QScopedPointer
或 std::unique_ptr
.
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 小部件设定的期望值。
我正在使用 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
了,关闭的时候会自动得到delete
d。
您可以尝试使用以下方法删除指向 ViewWindow
的指针:delete SomeWindow;
你需要做两件事:
即使 window 没有关闭,也必须管理 window 的生命周期。
您可以给它一个 parent,您知道它会在某个时候结束它的生命。或者您可以使用
QScopedPointer
或std::unique_ptr
.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 小部件设定的期望值。