Qt父项在子项关闭后删除变量 我用Qt库在C++中编写一个应用程序。有一个中心窗口(父窗口),需要时启动所有子窗口。由于这些窗口中有许多可以多次打开,但显示不同的数据,因此我使用new声明对象。下面是我得到的一个例子:
Home_Window.hppQt父项在子项关闭后删除变量 我用Qt库在C++中编写一个应用程序。有一个中心窗口(父窗口),需要时启动所有子窗口。由于这些窗口中有许多可以多次打开,但显示不同的数据,因此我使用new声明对象。下面是我得到的一个例子:,c++,qt,signals,slot,C++,Qt,Signals,Slot,Home_Window.hpp View\u Window*SomeWindow; Home_Window.cpp void Home\u Window::在\u Window按钮上单击() { SomeWindow=新视图\窗口(); SomeWindow->show(); } 我想做的是在窗口关闭时删除对象,以减少应用程序的内存占用。我已经能够删除子窗口中包含的所有对象以减少内存使用,但核心对象仍然存在,如果用户在一天内打开和关闭1000个窗口,并且每个对象都拥有40-50KB的内存,应
View\u Window*SomeWindow;
Home_Window.cpp
void Home\u Window::在\u Window按钮上单击()
{
SomeWindow=新视图\窗口();
SomeWindow->show();
}
我想做的是在窗口关闭时删除对象,以减少应用程序的内存占用。我已经能够删除子窗口中包含的所有对象以减少内存使用,但核心对象仍然存在,如果用户在一天内打开和关闭1000个窗口,并且每个对象都拥有40-50KB的内存,应用程序的内存占用从几兆字节增加到100兆字节
我还没能在网上找到一本能让我实现这一目标的指南。我在考虑插槽和信号对,因为我知道当窗口关闭时,它会发送QObject::destromed()
信号。唯一的问题是,我并没有尝试过像这样设置信号和插槽对
如果您有任何建议,我们将不胜感激。要在窗口关闭时删除该窗口,您可以在其上设置属性。您在\u WindowButton\u clicked()上的
应该类似于:
void Home_Window::on_WindowButton_clicked()
{
View_Window* w= new View_Window();
w->setAttribute(WA_DeleteOnClose);
w->show();
}
这样,您就不必担心自己破坏w
,当窗口关闭时,它将自动获得delete
d。要在窗口关闭时删除窗口,您可以在其上设置属性。您在\u WindowButton\u clicked()上的应该类似于:
void Home_Window::on_WindowButton_clicked()
{
View_Window* w= new View_Window();
w->setAttribute(WA_DeleteOnClose);
w->show();
}
这样,您就不必担心自己会被销毁,当它关闭时,它会自动得到delete
d。您可以尝试使用以下命令删除指向ViewWindow
的指针:delete SomeWindow
您可以尝试使用以下命令删除指向ViewWindow
的指针:delete SomeWindow代码>您需要做两件事:
即使窗口未关闭,也必须管理窗口的生存期
你可以给它一个你知道会在某个时候结束它生命的父母。或者您可以使用QScopedPointer
或std::unique\u ptr
窗口关闭时必须删除自身
至少,您应该设置Qt::Window
标志。Qt::Dialog
包括Qt::Window
标志,还声明该窗口是一个对话框-该事实具有特定于平台的解释;了解有关窗口标志的更多信息
如果您的视图\u窗口的API已损坏,并且没有将窗口标志作为构造函数的第二个参数,则需要单独设置:
window->setWindowFlags(Qt::Dialog);
每个小部件都应该将Qt::WindowFlags
作为构造函数的可选第二个参数,默认值反映窗口的常用用法。这是所有Qt小部件设定的期望值。您需要做两件事:
即使窗口未关闭,也必须管理窗口的生存期
你可以给它一个你知道会在某个时候结束它生命的父母。或者您可以使用QScopedPointer
或std::unique\u ptr
窗口关闭时必须删除自身
至少,您应该设置Qt::Window
标志。Qt::Dialog
包括Qt::Window
标志,还声明该窗口是一个对话框-该事实具有特定于平台的解释;了解有关窗口标志的更多信息
如果您的视图\u窗口的API已损坏,并且没有将窗口标志作为构造函数的第二个参数,则需要单独设置:
window->setWindowFlags(Qt::Dialog);
每个小部件都应该将Qt::WindowFlags
作为构造函数的可选第二个参数,默认值反映窗口的常用用法。这是所有Qt小部件设置的期望值。这是我设置的,但我在View\u窗口对象的构造函数中指定了它。经过一些测试,我的担心似乎是无缘无故的,因为我总共打开了大约8次窗口,内存使用量从6.2MB到6.8MB不等,之后每次打开窗口,内存都保持不变。但是,对于其他人来说,这是非常有帮助的。如果是这样的话,我只需要重新编写一点点代码,这是我设置的,但是我在View_Window对象的构造函数中指定了它。经过一些测试,我的担心似乎是无缘无故的,因为我总共打开了大约8次窗口,内存使用量从6.2MB到6.8MB不等,之后每次打开窗口,内存都保持不变。但是,对于其他人来说,这是非常有帮助的。如果是这样的话,我只需要重新编写一点代码