gpt4 book ai didi

c++ - QDialogs 中是否需要析构函数?

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:44 28 4
gpt4 key购买 nike

我正在关注 Qt 示例(如 TabDialog ),我注意到所有 UI 项目都是作为指针创建的 - 但我没有看到 delete 也没有析构函数。

是吗?这不会导致内存泄漏吗?

我正在尝试添加析构函数

~TabDialog()
{
delete tabWidget;
delete buttonBox;
}

和来电者

TabDialog *tabDialog = new TabDialog();
tabDialog->setAttribute(Qt::WA_DeleteOnClose);
tabDialog->exec();

但是当我关闭对话框时程序崩溃了。

析构函数和delete 所有指针项都是不必要的还是我做错了?

最佳答案

我认为你因为这些行而感到困惑:

tabWidget = new QTabWidget;//and so on

您看不到明确的父级(如 new QTabWidget(this);),但这里没有必要。看这里:

QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(tabWidget);
mainLayout->addWidget(buttonBox);
setLayout(mainLayout);

setLayout 将重新设置您的 QVBoxLayout 并且 QVBoxLayout 将重新设置其中所有小部件的父级,所以现在您的小部件有一个父级并且它们将被销毁在你的对话之后。

作为doc说:

When you use a layout, you do not need to pass a parent when constructing the child widgets. The layout will automatically reparent the widgets (using QWidget::setParent()) so that they are children of the widget on which the layout is installed.

Note: Widgets in a layout are children of the widget on which the layout is installed, not of the layout itself. Widgets can only have other widgets as parent, not layouts.

关于c++ - QDialogs 中是否需要析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140280/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com