Название: parent для QLayout для автоматического удаления? Отправлено: vipet от Ноябрь 03, 2007, 18:51 При создании QWidget, можно передавать QWidget *parent. Т.о. при смерти parent, его дети тоже поумирают. Хочется аналогичного поведения и для QLayout в ситуации, когда он добавляется в другой QLayout через addLayout(). Класс QLayout не является потомком QWidget, поэтому указать его конструктору в качестве parent нельзя. Выход - создавать дополнительно QWidget, который будет parent'ом QLayout'а. А в QLayout верхнего уровня добавлять уже этот widget посредством addWidget(), а не layout. Т.е. имеем лишнюю сущность в виде этого widget'а. Или все же можно для QLayout задать его владельца, при удалении которого он бы тоже удалялся? В продуктах Борланда есть разделение на parent и owner, а в куте нету... Название: Re: parent для QLayout для автоматического удаления? Отправлено: Пантер от Ноябрь 03, 2007, 19:09 На сколько я знаю, parent для Layout не нужно указывать... По крайней мере в примерах, которые я видел, не указывалось.
Название: Re: parent для QLayout для автоматического удаления? Отправлено: vipet от Ноябрь 03, 2007, 19:24 На сколько я знаю, parent для Layout не нужно указывать... По крайней мере в примерах, которые я видел, не указывалось. parent для Layout не нужно указывать, но можно. Либо он потом будет установлен при привязке к другому виджету. Из ассистанта (Basic Layouts Example): Note that we don't have to specify a parent for the widgets when we create them. The reason is that all the widgets we create here will be added to a layout, and when we add a widget to a layout, it is automatically reparented to the widget the layout is installed on. Но можно ли предположить, что для layout'ов действует тот же механизм - при добавлении в другой лэйаут, он будет занесен в список детей этого лэйаута, и при удалении все корректно удалится? Скорее всего да, надо исходники посмотреть Название: Re: parent для QLayout для автоматического удаления? Отправлено: vipet от Ноябрь 03, 2007, 19:38 Посмотрел исходники. Во-первый addLayout() - это метод QBoxLayout'a, а не QLayout'a.
Вот его код: Код: void QBoxLayout::insertLayout(int index, QLayout *layout, int stretch) Т.е. происходит добавление в список item'ов. А в деструкторе все item'ы удаляются. Вопрос исчерпан :) Название: Re: parent для QLayout для автоматического удаления? Отправлено: Dodge от Ноябрь 04, 2007, 02:18 Ахррррррр... скока раз уже поднимался вопрос авто удаления объектов в Qt...
Скажу так: Если у вас в программе, с точки зрения принципов программирования с использованием библиотеки Qt, все написанно правильно, то про оператор delete можно забыть. Я считаю нада закрыть вопрос и все следующие посты связанные с этой темой лочить с припиской "см doc.trolltech.com" Скока можно то уже... механизм удаления "детей"(жуть ;D) не завязан на виджеты, он завязан на класс - QObject, следовательно при удалении объекта класса(или наследника от оного)QObject, удаляются все его "дети". + в туже степь, если необходимо удалить объект класса QObject(или наследников), из собственного слота, !СМЕЛО! вызываем deleteLater(). Название: Re: parent для QLayout для автоматического удаления? Отправлено: vipet от Ноябрь 04, 2007, 04:15 Dodge, ок, спасибо.
Но вопрос возник все-тки не на пустом месте. QLayout может быть присобачен к виджету. Также он может быть добавлен к другому лэйауту. Стыковка с виджетом может задаваться параметром конструктора. А стыковка с другим лэйатуом - нет. ИМХО было бы логично добавить конструктор и для этого. Но его нету, и надо писать лишнюю строчку Layout1->addLayout(Layout2); 8) Название: Re: parent для QLayout для автоматического удаления? Отправлено: vaprele07 от Ноябрь 04, 2007, 05:43 Цитировать ИМХО было бы логично добавить конструктор и для этого. было бы совсем не логично, так как не все лэйауты это поддерживают:Цитировать void QLayout::addItem ( QLayoutItem * item ) [pure virtual] Implemented in subclasses to add an item. How it is added is specific to each subclass. This function is not usually called in application code. To add a widget to a layout, use the addWidget() function; to add a child layout, use the addLayout() function provided by the relevant QLayout subclass. Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it. Название: Re: parent для QLayout для автоматического удаления? Отправлено: ритт от Ноябрь 04, 2007, 08:47 > механизм удаления "детей"
мне больше нравится термин "убийство детей" или "родитель убивает своих детей" :) а ветку действительно фтопку... Название: Re: parent для QLayout для автоматического удаления? Отправлено: pastor от Ноябрь 04, 2007, 14:52 Но его нету, и надо писать лишнюю строчку Layout1->addLayout(Layout2); 8) А чем не угодил метод addLayout? Помоему через методы addLayout, addWidget все прозрачно и понятно: через конструктор указываем виждет, на котором размещаеться наш Layout; посредством методов addLayout, addWidget устанавливаем Layout и виждет соответственно, которые будут размещаться на нашем Layout'е. Что ещё нужно? Единственное примечание насчёт удаления Layout это: Цитировать The layout's widgets aren't destroyed. Название: Re: parent для QLayout для автоматического удаления? Отправлено: vipet от Ноябрь 06, 2007, 19:16 addLayout() всем угодил уже. А то, что виджеты лэйаута не удаляются, это нормально, они имеют своего родителя (другого виджета).
Цитировать было бы совсем не логично, так как не все лэйауты это поддерживают тогда согласен. |