Russian Qt Forum

Qt => Общие вопросы => Тема начата: Hellhang от Июль 27, 2010, 07:28



Название: QObject QList<QObject*> Список объектов
Отправлено: Hellhang от Июль 27, 2010, 07:28
Вопрос по Qt:

Код:
MainWindow::MainWindow()
{
mainLayout  = new QHBoxLayout;
button = new MyButton;

mainLayout->addWidget(button);

setLayout(mainLayout);
}

Получается как только я устанавливаю менеджер компоновки для главного окна, для всех виджетов в качестве родителя будет указан наш MainWindow. Самое интересное начинается при вызове деструктора MainWindow:

Код:
MainWindow::~MainWindow()
{
qDebug() << "Destruct main window";
}

Как только MainWindow удаляется, вызывается его деструктор и я получаю отладочное сообщение, а в след за ним идет отладочное сообщение виджета MyButton. Насколько я помню у QObject есть QList<QObject*> который хранит все виджеты которые мы создавали с указанием родителя. Собственно вопрос, так ли все это происходит или я что-то путаю?


Название: Re: QObject QList<QObject*> Список объектов
Отправлено: SABROG от Июль 27, 2010, 09:10
addWidget() заставляет компоновщик усыновить сиротский виджет без родителя, а MainWindow становится его бабушкой, так как компоновщик является её ребенком. В итоге образуется связь MainWindow->Layout->MyButton. Цепь замкнулась, при удалении верхнего объекта все дети и их потомки удаляются автоматически.


Название: Re: QObject QList<QObject*> Список объектов
Отправлено: Hellhang от Июль 27, 2010, 09:17
Но происходит это в деструкторе QObject ? В деструкторе MainWindow освобождение памяти под button не происходит.


Название: Re: QObject QList<QObject*> Список объектов
Отправлено: SABROG от Июль 27, 2010, 10:46
Но происходит это в деструкторе QObject ? В деструкторе MainWindow освобождение памяти под button не происходит.

Сначала выполняются  деструкторы "верхних" объектов, поэтому деструктор button будет вызван после того как произойдет выход из деструктора MainWindow.


Название: Re: QObject QList<QObject*> Список объектов
Отправлено: Igors от Июль 27, 2010, 11:15
Как только MainWindow удаляется, вызывается его деструктор и я получаю отладочное сообщение, а в след за ним идет отладочное сообщение виджета MyButton. Насколько я помню у QObject есть QList<QObject*> который хранит все виджеты которые мы создавали с указанием родителя. Собственно вопрос, так ли все это происходит или я что-то путаю?
Происходит правильно. Сначала вызывается деструктор MainWindow, в этот момент все children еще на своих местах. Затем вызывается  деструктор QMainwindow (т.к. от него порожден MainWindow) который удаляет всех children.


Название: Re: QObject QList<QObject*> Список объектов
Отправлено: Hellhang от Июль 27, 2010, 11:53
Во общем как я и предполагал. Получается что писать деструктор только ради того чтобы удалить виджеты которые имееют родителя нет смысла. Всем спасибо