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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Указывть или нет parent для создаваемых widgetoв  (Прочитано 6491 раз)
burunduk
Гость
« : Январь 27, 2006, 13:40 »

Вопрос в следующем.
Есть у меня главное окно, например.
И в его конструкторе я пишу "... new QComboBox(this);" , а могу и просто "... new QComboBox;" без указания родителя.

В чем разница и какие могут быть последствия ?
Если я этот QComboBox включаю потом в layout manager, то Qt прекрасно знает о том что главное окно имеет такой то layout manager, а layout manager имеет QComboBox и никаких утечек памяти не происходит. Поправьте если это не так.
Записан
yshurik
Гость
« Ответ #1 : Январь 27, 2006, 14:06 »

Всё правильно. Но если не ошибаюсь, то когда пишешь new QComboBox(this); то он будет наследовать свойства парента такие как шрифт, палитру итд. Если такие свойства не меняешь то и разницы не заметишь.
Записан
nEoN
Гость
« Ответ #2 : Январь 27, 2006, 15:03 »

Цитата: "burunduk"
Вопрос в следующем.
Есть у меня главное окно, например.
И в его конструкторе я пишу "... new QComboBox(this);" , а могу и просто "... new QComboBox;" без указания родителя.

В чем разница и какие могут быть последствия ?
Если я этот QComboBox включаю потом в layout manager, то Qt прекрасно знает о том что главное окно имеет такой то layout manager, а layout manager имеет QComboBox и никаких утечек памяти не происходит. Поправьте если это не так.


В данном случае почти никакой разницы, т.к. при добавлении виджета в layout, родилем (parent) виджета становится владелец layouta.
Разница скорее в стиле написания. Если заглянуть в сгенерированные Qt ui файлы, то там троллтехи делают это так :
Код:
void setupUi(QDialog *MyDialog)
{
  ...
  hboxLayout = new QHBoxLayout(MyDialog);
  pushButton1 = new QPushButton(MyDialog);
  hboxLayout->addWidget(pushButton1);
  ...
}
Записан
Dendy
Гость
« Ответ #3 : Январь 27, 2006, 16:21 »

Совершенно в дьІрочку. Свойства виджета не будут проявляться, пока он не бьІл показан в первьІй раз. Так что дело в стиле. Ещё нужно помнить, что для обьекта без родителя работает собьІтийньІй механизм, однако при завершении приложения автоматически удалён он не будет.
Записан
burunduk
Гость
« Ответ #4 : Январь 27, 2006, 16:35 »

не понял, а операционная система тоже забъёт их освобождать по заверщению приложения, что ли ?

Цитата: "Dendy"
...что для обьекта без родителя работает собьІтийньІй механизм, однако при завершении приложения автоматически удалён он не будет.
Записан
nEoN
Гость
« Ответ #5 : Январь 27, 2006, 16:49 »

Цитата: "burunduk"
не понял, а операционная система тоже забъёт их освобождать по заверщению приложения, что ли ?

Смотря какая ОС :-)
Win95 например забила бы, а современные ОС как Win, так и Linux освобождают память процесса (программы) при его завершении. Но всё равно, такого не допускать не надо.
Записан
burunduk
Гость
« Ответ #6 : Январь 27, 2006, 16:53 »

т.е. я так понял всё же лучше когда объекты с родителем
Записан
nEoN
Гость
« Ответ #7 : Январь 27, 2006, 17:04 »

Цитата: "burunduk"
т.е. я так понял всё же лучше когда объекты с родителем

Коротко говоря, да.
Записан
Dendy
Гость
« Ответ #8 : Январь 27, 2006, 19:08 »

Не всегда. Например, с потоками нужно осторожно. Перед удалением ему желательно вставить QThread::wait().
Записан
Вудруф
Гость
« Ответ #9 : Январь 31, 2006, 10:13 »

Насколько я помню, объекты без парентов автоматически приписываются к QApplication, и удаляются по завершении программы... По крайней мере, я так всегда считал.
Рассчитывать на удаление памяти после завершения программы можно и нужно! Таким образом, память, выделяемая в main, может и не чиститься. Однако все другие объекты удалять стоит...
Однако тут есть такие камни: если нужно использовать виджет внутри другого, то логичнее всего сделать его парентом. Например, диалог, вызываемый только из этого места.
Записан
Dendy
Гость
« Ответ #10 : Январь 31, 2006, 10:51 »

QApplication НЕ должен удалять обьектьІ без родителя. Он нужен для базовьІх функций приложения, но может создаваться и удаляться несколько раз в программе или вообще не создаваться ни разу, ето нормально. Есть классьІ, порождённьІе от QObject, но основная их задача - работа не по собьІтиям, а сихнронньІй вьІзов методов, например QFile (для QIODevice), QImage (для QPaintDevice).

Ети классьІ не обязаньІ иметь родителя и пришибаться должньІ руками.

Для глобальньІх деструкторов правильно юзать QtCleanupFunction, которьІе будут вьІзьІваться в деструкторе QCoreApplication.
Записан
Вудруф
Гость
« Ответ #11 : Январь 31, 2006, 12:24 »

Признаю, ошибся..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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