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

时间:2012-04-17 17:08:33

标签: c++ qt

我正在查看示例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"));
}

3 个答案:

答案 0 :(得分:18)

来自Layout Management

  

使用布局的提示

     

使用布局时,不需要传递父级   构建子窗口小部件。 布局将自动进行   重新显示小部件(使用QWidget :: setParent())以便它们是   安装布局的小部件的子级。

     

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

     

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

答案 1 :(得分:2)

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

以下是addWidget()的实施:

void QLayout::addWidget(QWidget *w)
{
    addChildWidget(w);
    addItem(QLayoutPrivate::createWidgetItem(this, w));
}

说明:

  1. addChildWidget()只是确保从其他布局中删除托管窗口小部件。

  2. createWidgetItem(this, w)分配一个新的QWidgetItem。此QWidgetItem存储指向w的指针,但不接受w 的所有权。

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

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

答案 2 :(得分:0)

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