Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Mashko от Май 25, 2009, 15:44



Название: Удалить виджет из verticalLayout
Отправлено: Mashko от Май 25, 2009, 15:44
Есть verticalLayout, в нём распологается один виджет, какой именно не известно (removeWidget(QWidget *widget) применять получается бессмысленно).
Задача: нужно удалить из лейаута этот виджет и впихнуть туда другой.

Пробовала удалять через removeItem(QLayoutItem), скатала со справки:
Код:
QLayoutItem *child;
while ((child = verticalLayout->takeAt(0)) != 0) {
            delete child;
    }
Затем, когда добавляю новый виджет через addWidget(widget) он как будто накладывается на тот, который должен бы быть по идее удаленным.
В чем ошибка?  ???


Название: Re: Удалить виджет из verticalLayout
Отправлено: Авварон от Май 25, 2009, 16:39
может надо void update () сделать? а спрашивать в чем ошибка примера из Ассистанта это конечно оригинально...


Название: Re: Удалить виджет из verticalLayout
Отправлено: Mashko от Май 25, 2009, 19:20
Если бы всё работало как надо, я бы и спрашивала соответственно


Название: Re: Удалить виджет из verticalLayout
Отправлено: spectre71 от Май 26, 2009, 09:25
Все работает как надо.
В Assistant пример выглядел подругому!
Там есть еще "..."

Код:
 QLayoutItem *child;
 while ((child = layout->takeAt(0)) != 0) {
     ...
     delete child;
 }

Сделай:

Код:
 QLayoutItem *child;
 while ((child = layout->takeAt(0)) != 0) {
     layout->removeItem(child);
     delete child;
 }


removeItem - не уничтожает QLayoutItem, а удаляет объект из списка
"Removes the layout item item from the layout. It is the caller's responsibility to delete the item."

delete child; - уничтожает объект. Но в списке то указатель на него остается!





Название: Re: Удалить виджет из verticalLayout
Отправлено: Авварон от Май 26, 2009, 10:04
Цитировать
QLayoutItem * QLayout::takeAt ( int index )   [pure virtual]

Must be implemented in subclasses to remove the layout item at index from the layout, and return the item
она уже должна удалить...


Название: Re: Удалить виджет из verticalLayout
Отправлено: spectre71 от Май 26, 2009, 10:54
Это работает

Код
C++ (Qt)
 
 QLayoutItem *child = layout->takeAt(0);
 if(!child) {return;}
 QWidget* w = child->widget();
 delete child;
 if(!w) {return;}
 layout->removeWidget(w);
 
 delete w; //or // w->setVisible(false); // or // otherLayout->addWidget(w);
 
 


Название: Re: Удалить виджет из verticalLayout
Отправлено: pastor от Сентябрь 04, 2010, 18:18
Поднимаю тему- аналогичная проблема как у топик стартера, только вышеприведенная констукция не помагает. виджеты не удаляются, а как были так и остаются на главном окне. вопрос -почему такое может быть? Виджеты добавляю стандартным средством addWidget

Какая именно из вышеприведенных конструкций не работает?


Название: Re: Удалить виджет из verticalLayout
Отправлено: Ovoshlook от Сентябрь 04, 2010, 18:26
прошу прощения. Все работает. Это я невнимательный. Не все переписал- delete w забыл написать)))

Еще раз извините)