Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt父项在子项关闭后删除变量 我用Qt库在C++中编写一个应用程序。有一个中心窗口(父窗口),需要时启动所有子窗口。由于这些窗口中有许多可以多次打开,但显示不同的数据,因此我使用new声明对象。下面是我得到的一个例子:_C++_Qt_Signals_Slot - Fatal编程技术网

Qt父项在子项关闭后删除变量 我用Qt库在C++中编写一个应用程序。有一个中心窗口(父窗口),需要时启动所有子窗口。由于这些窗口中有许多可以多次打开,但显示不同的数据,因此我使用new声明对象。下面是我得到的一个例子:

Qt父项在子项关闭后删除变量 我用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的内存,应

Home_Window.hpp

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不等,之后每次打开窗口,内存都保持不变。但是,对于其他人来说,这是非常有帮助的。如果是这样的话,我只需要重新编写一点代码