Обладает ли владелец 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 (макет).