20

我在这里查看示例,想知道是否没有内存泄漏。我有一篇关于 delete 上的 subjet mem 泄漏的文章。然而,虽然 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"));
}
4

3 回答 3

28

布局管理

使用布局的提示

使用布局时,在构造子小部件时不需要传递父级。布局将自动重新设置小部件的父级(使用 QWidget::setParent()),以便它们是安装了布局的小部件的子级。

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

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

于 2012-04-17T17:14:08.970 回答
3

不,QLayouts 不拥有托管 QWidgets 的所有权。

这里是实现addWidget()

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

解释:

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

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

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

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

于 2016-06-23T23:18:43.253 回答
0

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

于 2021-03-18T09:54:36.767 回答