Russian Qt Forum

Qt => Общие вопросы => Тема начата: vipet от Ноябрь 03, 2007, 18:51



Название: 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)
{
    Q_D(QBoxLayout);
    addChildLayout(layout);
    if (index < 0)                                // append
        index = d->list.count();
    QBoxLayoutItem *it = new QBoxLayoutItem(layout, stretch);
    d->list.insert(index, it);
    invalidate();
}

Т.е. происходит добавление в список 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() всем угодил уже. А то, что виджеты лэйаута не удаляются, это нормально, они имеют своего родителя (другого виджета).

Цитировать
было бы совсем не логично, так как не все лэйауты это поддерживают

тогда согласен.