Обладает ли владелец QBoxLayout владельцем всех виджетов макета?

Я смотрел на пример здесь и задавался вопросом, нет ли утечек памяти. У меня есть красная статья, в которой говорится о подтеке утечки 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"));
}

Ответ 1

Из Управление макетами:

Советы по использованию макетов

Когда вы используете макет, вам не нужно передавать родителя, когда создание дочерних виджетов. Макет будет автоматически повторить виджетов (используя QWidget:: setParent()), чтобы они были дочерние элементы виджета, на котором установлен макет.

Примечание. Виджеты в макете являются дочерними элементами виджетов, на которых макет установлен, а не сама компоновка. Виджеты могут другие виджеты как родительские, а не макеты.

Вы можете планировать макеты с помощью addLayout() на макете; внутренняя компоновка затем становится дочерним элементом макета, в который он вставлен.

Ответ 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 (а не от QWidget, наблюдаемого QWidgetItem). Это означает, что QWidgetItem будет уничтожен, когда QLayout будет уничтожен. Однако QWidget w по-прежнему не будет уничтожен.

QWidget будет уничтожен, когда его родительский QWidget будет уничтожен. Такой родитель назначается автоматически QLayout, когда вызывается parent- > setLayout (макет).