我正在查看示例here,并想知道是否没有内存泄漏。我在论文中谈论了子喷气机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"));
}
答案 0 :(得分:18)
使用布局的提示
使用布局时,不需要传递父级 构建子窗口小部件。 布局将自动进行 重新显示小部件(使用QWidget :: setParent())以便它们是 安装布局的小部件的子级。
注意:布局中的窗口小部件是窗口小部件的子窗口 布局是安装的,而不是布局本身。小部件只能有 其他小部件作为父级,而不是布局。
您可以在布局上使用addLayout()嵌套布局;内部布局 然后成为插入布局的孩子。
答案 1 :(得分:2)
不,QLayouts不会获得托管QWidgets的所有权。
以下是addWidget()
的实施:
void QLayout::addWidget(QWidget *w)
{
addChildWidget(w);
addItem(QLayoutPrivate::createWidgetItem(this, w));
}
说明:
addChildWidget()
只是确保从其他布局中删除托管窗口小部件。
createWidgetItem(this, w)
分配一个新的QWidgetItem。此QWidgetItem存储指向w的指针,但不接受w 的所有权。
addItem()
将项添加到布局中,并取得QWidgetItem的所有权(不是QWidgetItem观察到的QWidget )。这意味着当QLayout被销毁时,QWidgetItem将被销毁。但是,QWidget w仍然不会被销毁。
当QWidget的父QWidget被销毁时,它将被销毁。当调用parent-> setLayout(layout)时,QLayout会自动分配这样的父级。
答案 2 :(得分:0)
不确定 2016 年的情况 - 但今天(Qt 5.15 ...)布局肯定会设置父级 ...