Название: Указывть или нет parent для создаваемых widgetoв Отправлено: burunduk от Январь 27, 2006, 13:40 Вопрос в следующем.
Есть у меня главное окно, например. И в его конструкторе я пишу "... new QComboBox(this);" , а могу и просто "... new QComboBox;" без указания родителя. В чем разница и какие могут быть последствия ? Если я этот QComboBox включаю потом в layout manager, то Qt прекрасно знает о том что главное окно имеет такой то layout manager, а layout manager имеет QComboBox и никаких утечек памяти не происходит. Поправьте если это не так. Название: Указывть или нет parent для создаваемых widgetoв Отправлено: yshurik от Январь 27, 2006, 14:06 Всё правильно. Но если не ошибаюсь, то когда пишешь new QComboBox(this); то он будет наследовать свойства парента такие как шрифт, палитру итд. Если такие свойства не меняешь то и разницы не заметишь.
Название: Re: Указывть или нет parent для создаваемых widgetoв Отправлено: nEoN от Январь 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) Название: Указывть или нет parent для создаваемых widgetoв Отправлено: Dendy от Январь 27, 2006, 16:21 Совершенно в дьІрочку. Свойства виджета не будут проявляться, пока он не бьІл показан в первьІй раз. Так что дело в стиле. Ещё нужно помнить, что для обьекта без родителя работает собьІтийньІй механизм, однако при завершении приложения автоматически удалён он не будет.
Название: Указывть или нет parent для создаваемых widgetoв Отправлено: burunduk от Январь 27, 2006, 16:35 не понял, а операционная система тоже забъёт их освобождать по заверщению приложения, что ли ?
Цитата: "Dendy" ...что для обьекта без родителя работает собьІтийньІй механизм, однако при завершении приложения автоматически удалён он не будет. Название: Указывть или нет parent для создаваемых widgetoв Отправлено: nEoN от Январь 27, 2006, 16:49 Цитата: "burunduk" не понял, а операционная система тоже забъёт их освобождать по заверщению приложения, что ли ? Смотря какая ОС :-) Win95 например забила бы, а современные ОС как Win, так и Linux освобождают память процесса (программы) при его завершении. Но всё равно, такого не допускать не надо. Название: Указывть или нет parent для создаваемых widgetoв Отправлено: burunduk от Январь 27, 2006, 16:53 т.е. я так понял всё же лучше когда объекты с родителем
Название: Указывть или нет parent для создаваемых widgetoв Отправлено: nEoN от Январь 27, 2006, 17:04 Цитата: "burunduk" т.е. я так понял всё же лучше когда объекты с родителем Коротко говоря, да. Название: Указывть или нет parent для создаваемых widgetoв Отправлено: Dendy от Январь 27, 2006, 19:08 Не всегда. Например, с потоками нужно осторожно. Перед удалением ему желательно вставить QThread::wait().
Название: Указывть или нет parent для создаваемых widgetoв Отправлено: Вудруф от Январь 31, 2006, 10:13 Насколько я помню, объекты без парентов автоматически приписываются к QApplication, и удаляются по завершении программы... По крайней мере, я так всегда считал.
Рассчитывать на удаление памяти после завершения программы можно и нужно! Таким образом, память, выделяемая в main, может и не чиститься. Однако все другие объекты удалять стоит... Однако тут есть такие камни: если нужно использовать виджет внутри другого, то логичнее всего сделать его парентом. Например, диалог, вызываемый только из этого места. Название: Указывть или нет parent для создаваемых widgetoв Отправлено: Dendy от Январь 31, 2006, 10:51 QApplication НЕ должен удалять обьектьІ без родителя. Он нужен для базовьІх функций приложения, но может создаваться и удаляться несколько раз в программе или вообще не создаваться ни разу, ето нормально. Есть классьІ, порождённьІе от QObject, но основная их задача - работа не по собьІтиям, а сихнронньІй вьІзов методов, например QFile (для QIODevice), QImage (для QPaintDevice).
Ети классьІ не обязаньІ иметь родителя и пришибаться должньІ руками. Для глобальньІх деструкторов правильно юзать QtCleanupFunction, которьІе будут вьІзьІваться в деструкторе QCoreApplication. Название: Указывть или нет parent для создаваемых widgetoв Отправлено: Вудруф от Январь 31, 2006, 12:24 Признаю, ошибся..
|