我正在使用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()
信号。唯一的问题是,我没有尝试像这样设置信号和插槽对。
任何建议都表示赞赏。
答案 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)
你需要做两件事:
即使窗口未关闭,也必须管理窗口的生命周期。
你可以给它一个你知道会在某个时候结束生命的父母。或者您可以使用QScopedPointer
或std::unique_ptr
。
窗口必须在关闭时自行删除。
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;
的指针