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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: parent для QLayout для автоматического удаления?  (Прочитано 7067 раз)
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« : Ноябрь 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, а в куте нету...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 03, 2007, 19:09 »

На сколько я знаю, parent для Layout не нужно указывать... По крайней мере в примерах, которые я видел, не указывалось.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #2 : Ноябрь 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'ов действует тот же механизм - при добавлении в другой лэйаут, он будет занесен в список детей этого лэйаута, и при удалении все корректно удалится? Скорее всего да, надо исходники посмотреть
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #3 : Ноябрь 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'ы удаляются.

Вопрос исчерпан  Улыбающийся



Записан
Dodge
Гость
« Ответ #4 : Ноябрь 04, 2007, 02:18 »

Ахррррррр... скока раз уже поднимался вопрос авто удаления объектов в Qt...
Скажу так: Если у вас в программе, с точки зрения принципов программирования с использованием библиотеки Qt, все написанно правильно, то про оператор delete можно забыть.
Я считаю нада закрыть вопрос и все следующие посты связанные с этой темой лочить с припиской "см doc.trolltech.com"
Скока можно то уже... механизм удаления "детей"(жуть  Смеющийся) не завязан на виджеты, он завязан на класс - QObject, следовательно при удалении объекта класса(или наследника от оного)QObject, удаляются все его "дети".
+ в туже степь, если необходимо удалить объект класса QObject(или наследников), из собственного слота, !СМЕЛО! вызываем deleteLater().
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #5 : Ноябрь 04, 2007, 04:15 »

Dodge, ок, спасибо.

Но вопрос возник все-тки не на пустом месте.

QLayout может быть присобачен к виджету. Также он может быть добавлен к другому лэйауту.
Стыковка с виджетом может задаваться параметром конструктора. А стыковка с другим лэйатуом - нет.
ИМХО было бы логично добавить конструктор и для этого.
Но его нету, и надо писать лишнюю строчку Layout1->addLayout(Layout2);  Крутой




Записан
vaprele07
Гость
« Ответ #6 : Ноябрь 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.
Записан
ритт
Гость
« Ответ #7 : Ноябрь 04, 2007, 08:47 »

> механизм удаления "детей"

мне больше нравится термин "убийство детей" или "родитель убивает своих детей" Улыбающийся

а ветку действительно фтопку...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Ноябрь 04, 2007, 14:52 »

Но его нету, и надо писать лишнюю строчку Layout1->addLayout(Layout2);  Крутой

А чем не угодил метод addLayout? Помоему через методы addLayout, addWidget все прозрачно и понятно: через конструктор указываем виждет, на котором размещаеться наш Layout; посредством методов addLayout, addWidget устанавливаем Layout и виждет соответственно, которые будут размещаться на нашем Layout'е. Что ещё нужно? Единственное примечание насчёт удаления Layout это:

Цитировать
The layout's widgets aren't destroyed.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #9 : Ноябрь 06, 2007, 19:16 »

addLayout() всем угодил уже. А то, что виджеты лэйаута не удаляются, это нормально, они имеют своего родителя (другого виджета).

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

тогда согласен.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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