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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалить виджет из verticalLayout  (Прочитано 7549 раз)
Mashko
Гость
« : Май 25, 2009, 15:44 »

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Май 25, 2009, 16:39 »

может надо void update () сделать? а спрашивать в чем ошибка примера из Ассистанта это конечно оригинально...
Записан
Mashko
Гость
« Ответ #2 : Май 25, 2009, 19:20 »

Если бы всё работало как надо, я бы и спрашивала соответственно
Записан
spectre71
Гость
« Ответ #3 : Май 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; - уничтожает объект. Но в списке то указатель на него остается!



Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Май 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
она уже должна удалить...
Записан
spectre71
Гость
« Ответ #5 : Май 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);
 
 
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Сентябрь 04, 2010, 18:18 »

Поднимаю тему- аналогичная проблема как у топик стартера, только вышеприведенная констукция не помагает. виджеты не удаляются, а как были так и остаются на главном окне. вопрос -почему такое может быть? Виджеты добавляю стандартным средством addWidget

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Ovoshlook
Гость
« Ответ #7 : Сентябрь 04, 2010, 18:26 »

прошу прощения. Все работает. Это я невнимательный. Не все переписал- delete w забыл написать)))

Еще раз извините)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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