Название: QObject QList<QObject*> Список объектов Отправлено: Hellhang от Июль 27, 2010, 07:28 Вопрос по Qt:
Код: MainWindow::MainWindow() Получается как только я устанавливаю менеджер компоновки для главного окна, для всех виджетов в качестве родителя будет указан наш MainWindow. Самое интересное начинается при вызове деструктора MainWindow: Код: MainWindow::~MainWindow() Как только 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 Во общем как я и предполагал. Получается что писать деструктор только ради того чтобы удалить виджеты которые имееют родителя нет смысла. Всем спасибо
|