Qt父级在子级关闭后删除变量
Qt Parent to delete variable after child has closed
我正在使用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。
您需要做两件事:
-
即使窗口没有关闭,也必须管理窗口的生存期。
你可以给它一个父母,你知道会在某个时候结束它的生命。或者您可以使用
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
标志,并且还声明该窗口为对话框——这一事实具有特定于平台的解释;点击这里了解更多关于窗口标志的信息。
如果你的View_Window
的API坏了,它不把窗口标志作为构造函数的第二个参数,你需要分别设置它们:
window->setWindowFlags(Qt::Dialog);
每个小部件都应该将Qt::WindowFlags
作为构造函数的第二个可选参数,并使用反映窗口通常使用的默认值。
您可以尝试使用以下命令删除指向ViewWindow
的指针:delete SomeWindow;
- 将数组的地址分配给变量并删除
- 根据模板类型有条件地删除变量
- 我无法删除 wxApp 类的成员变量
- 使用 ostream 变量删除代码重复
- 如何一次删除"cmake -D"定义的所有变量?
- 如何删除作为C++联合的成员变量的字符串对象
- 从文件名变量中删除".txt"
- 如何删除可以是指针(模板)的变量?
- C :动态分配的变量未在clang中删除
- 从函数中删除动态内存分配,但无法访问变量
- 如果我不删除动态创建的变量会发生什么
- C :从双变量的分数部分中删除尾随零
- 您可以删除本地静态变量吗?
- 将删除运算符放置在何处以进行动态变量
- GNU 调试器无法从显示中删除变量?
- 如何使用C 中的BSTR删除变量
- C++const_cast不会删除变量的constness
- 我无法理解为什么从子类中删除变量后输出会发生变化
- Qt父级在子级关闭后删除变量
- 删除变量时出现奇怪错误