Russian Qt Forum
Ноябрь 25, 2024, 08:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QObject QList<QObject*> Список объектов  (Прочитано 3254 раз)
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*> который хранит все виджеты которые мы создавали с указанием родителя. Собственно вопрос, так ли все это происходит или я что-то путаю?
Записан
SABROG
Гость
« Ответ #1 : Июль 27, 2010, 09:10 »

addWidget() заставляет компоновщик усыновить сиротский виджет без родителя, а MainWindow становится его бабушкой, так как компоновщик является её ребенком. В итоге образуется связь MainWindow->Layout->MyButton. Цепь замкнулась, при удалении верхнего объекта все дети и их потомки удаляются автоматически.
Записан
Hellhang
Гость
« Ответ #2 : Июль 27, 2010, 09:17 »

Но происходит это в деструкторе QObject ? В деструкторе MainWindow освобождение памяти под button не происходит.
Записан
SABROG
Гость
« Ответ #3 : Июль 27, 2010, 10:46 »

Но происходит это в деструкторе QObject ? В деструкторе MainWindow освобождение памяти под button не происходит.

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 27, 2010, 11:15 »

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

Во общем как я и предполагал. Получается что писать деструктор только ради того чтобы удалить виджеты которые имееют родителя нет смысла. Всем спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 23.