qt - QPointer 和删除对象

标签 qt qdialog qpointer

我有一个 Qt 应用程序,它使用 QPointers 来显示新的 UI 对话框(小部件)。主应用程序可以有许多加载不同数据的相同小部件。我遇到的问题是删除和释放每个小部件的内存。如果我监视程序的 RAM 使用情况,每次单击按钮打开这些新小部件之一时,它都会增加 ram,而当我关闭小部件时,它似乎并没有释放 ram。我试过使用 deleteLater 和其他解决方案,但程序总是崩溃。

一些示例代码在这里:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

这将调用声明为 QDialog(非模态)的“ListReservations”小部件。在那个对话框中,我有一个按钮来关闭调用 QWidget::close() 槽的窗口。

我想问题是我的主程序(具有QPointer)如何知道对话框何时关闭然后释放对话框并(如果可能)删除指针以节省更多内存...

我认为您可以对 QPointer 对象执行 QConnect(),但我似乎找不到任何允许指针的传递,更不用说在对话框确实关闭并准备好删除后发送信号了。

也许我需要在主程序中使用某种函数来获取通用指针对象,然后让 QDialog 在调用它自己的关闭槽之前调用它?在那个函数中它会通过自己被销毁?只是抛出我尝试实现但失败的想法......

我不认为我可以在别处重用相同的指针,因为理论上您可以同时打开多个 ListReservations 窗口。

最佳答案

确保使用 QWidget::setAttribute() 在对话框中设置了 Qt::WA_DeleteOnClose 属性标志。这应该确保对话框在关闭时被正确销毁。查看Qt documentation了解更多详情。

假设内存现在已正确释放,指针应该会自行失效,从 Qt documentation :

A guarded pointer, QPointer, behaves like a normal C++ pointer T *, except that it is automatically set to 0 when the referenced object is destroyed (unlike normal C++ pointers, which become "dangling pointers" in such cases)

关于qt - QPointer 和删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2371750/

相关文章:

qt - 为 QML 应用程序定义窗口图标

c++ - 显示独立对话框

c++ - 使用 QPointer 和 QObject::connect 与 C++11

c++ - Qt:当QPointer改变时发出信号

c++ - 是否有一个智能指针在其目标在 C++ 中被销毁时自动清空

c++ - Qt Release DLL错误

c++ - 关系应用程序数据的并发更新

c++ - 将字符串从对话框传递到 MainWindow?

c++ - 我如何更改qt上的文件扩展名

python - 如何修复我的 pyqt 程序中的错误(未绑定(bind)方法的第一个参数必须具有类型 'QDialog' )?