QBoxLayout 的所有者是不是成为所有布局小部件的所有者?

Posted

技术标签:

【中文标题】QBoxLayout 的所有者是不是成为所有布局小部件的所有者?【英文标题】:Does owner of QBoxLayout become the owner of all layout widgets?QBoxLayout 的所有者是否成为所有布局小部件的所有者? 【发布时间】:2012-04-17 17:08:32 【问题描述】:

我正在查看示例here,并想知道是否没有内存泄漏。我把谈论 subjet mem leak on delete 的文章加红了。然而,虽然 QWidgets 确实保留了添加到的小部件的所有权,但布局却没有。

从 QT 代码看来,具有布局的父级获得了该布局的所有小部件的所有权。但是我在文档中看不到任何关于此的参考。

Window::Window()

 editor = new QTextEdit();
 QPushButton *sendButton = new QPushButton(tr("&Send message"));

 connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage()));

 QHBoxLayout *buttonLayout = new QHBoxLayout();
 buttonLayout->addStretch();
 buttonLayout->addWidget(sendButton);
 buttonLayout->addStretch();

 QVBoxLayout *layout = new QVBoxLayout(this);
 layout->addWidget(editor);
 layout->addLayout(buttonLayout);

 setWindowTitle(tr("Custom Type Sending"));

【问题讨论】:

虽然派生类没有提到它,但基本布局类(QLayout)说addWidget调用addItem...而addItem说:注意: item 的所有权转移给 layout,layout 负责删除它。" doc.qt.nokia.com/4.7-snapshot/qlayout.html#addItem @HostileFork item 的所有权转移到布局。不是小部件本身的所有权。请参阅我的 answer 试图澄清这一点。 【参考方案1】:

来自Layout Management:

使用布局的提示

当你使用一个布局时,你不需要传递一个父级 构建子小部件。 布局会自动 重新定义小部件(使用 QWidget::setParent()),以便它们 安装布局的小部件的子级。

注意:布局中的小部件是在其上的小部件的子级。 布局已安装,而不是布局本身。小部件只能有 其他小部件作为父级,而不是布局。

您可以在布局上使用 addLayout() 嵌套布局;内部布局 然后成为它所插入的布局的子级。

【讨论】:

没有找这个。谢谢你的回答。 对此的额外说明,然而,“所有权”被赋予布局,而父分配被赋予布局的父小部件:doc.trolltech.com/4.7/qlayout.html#addItem @jdi item 的所有权转移到布局。不是小部件本身的所有权。请参阅我的answer,它试图澄清这一点。 QWidget 的所有者(在内存管理意义上)始终是其父窗口小部件,因此不能是布局。【参考方案2】:

不,QLayouts 不获取托管 QWidgets 的所有权。

这里是addWidget()的实现:

void QLayout::addWidget(QWidget *w)

    addChildWidget(w);
    addItem(QLayoutPrivate::createWidgetItem(this, w));

解释:

    addChildWidget() 只是确保将托管小部件 w 从其他布局中删除。

    createWidgetItem(this, w) 分配一个新的 QWidgetItem。这个 QWidgetItem 存储了一个指向 w 的指针,但 不获取 w 的所有权

    addItem() 将项目添加到布局中,并取得 QWidgetItem 的所有权(不是 QWidgetItem 观察到的 QWidget)。这意味着当 QLayout 被销毁时 QWidgetItem 将被销毁。但是,QWidget w 仍然不会被销毁。

当它的父 QWidget 被销毁时,QWidget 将被销毁。这样的父级在调用 parent->setLayout(layout) 时由 QLayout 自动分配。

【讨论】:

【参考方案3】:

不确定 2016 年的情况如何 - 但今天(Qt 5.15 ...)布局肯定设置了父级...

【讨论】:

以上是关于QBoxLayout 的所有者是不是成为所有布局小部件的所有者?的主要内容,如果未能解决你的问题,请参考以下文章

将 QWidget 插入到特定位置的现有 QBoxLayout?

Qt垂直/水平布局管理器(QBoxLayout,QHBoxLayout, QVBoxLayout)

11.QT-布局管理器(Box,Grid,Form,Stacked)

如何检测 qt 标签(或任何小部件)是不是具有所需的所有空间?

Qt - 从布局中删除所有小部件?

清除pyqt布局中的所有小部件