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)