Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Exproment от Декабрь 19, 2011, 00:46



Название: [Решено] Как удалить Widget из layout'а
Отправлено: Exproment от Декабрь 19, 2011, 00:46
подскажите... Как правильно программно удалять виджеты из лайаута ??? Почему код:
Код
CAD DCL
QLayout* layout = ui.scrollAreaWidgetContents->layout();
for(int i = 0; i < layout->count(); ++i)
{
QLayoutItem* item = layout->itemAt(i);
if(item)
{
layout->removeItem( item );
QWidget* widget = item->widget();
if(widget)
{
layout->removeWidget(widget);
delete widget;
}
delete item;
}
}
 
Удаляет только четные виджеты ?(если код выполнить несколько раз то все нормально удалится 0_о) и почему функция layout->takeAt(0) возвращает 0 при полном лайауте ??? никак не разберусь  :(


Название: Re: Help!!! Как удалить Widget из layout'а
Отправлено: andrew.k от Декабрь 19, 2011, 01:48
Код
C++ (Qt)
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. If there is no such item, the function must do nothing and return 0. Items are numbered consecutively from 0. If an item is removed, other items will be renumbered.

Код
C++ (Qt)
while(layout->count())
{
 QLayoutItem * item = layout->itemAt(0);
...
}


Название: Re: Help!!! Как удалить Widget из layout'а
Отправлено: kambala от Декабрь 19, 2011, 02:28
Удаляет только четные виджеты ?
потому что после удаления надо ещё --i делать


Название: Re: Help!!! Как удалить Widget из layout'а
Отправлено: Exproment от Декабрь 19, 2011, 03:23
спасибо.. не подумал что он после удаления перестраивает LayoutItem. )

Решено.


Название: Re: [Решено] Как удалить Widget из layout'а
Отправлено: Exproment от Декабрь 19, 2011, 03:45
хммм.. возникла новая проблемка.. как вынуть виджет не удаляя его ? т.е. код:
Код
C++ (Qt)
while( (item = layout->itemAt(0)) )
{
layout->removeItem( item );
layout->removeWidget(item->widget());
delete item;
}
 
так же отображает виджеты и новый при добавлении рисуется поверх него.. 0_о
а код:
Код
C++ (Qt)
while( (item = layout->itemAt(0)) )
{
layout->removeItem( item );
layout->removeWidget(item->widget());
delete item->widget();
                       delete item;
layout->update();
}
работает правильно..но удаляет виджет.. который нужно сохранить(он должен продолжать работу даже если скрыт) - как вариант можно старый виджет сделать невизибл... но хотелось бы знать на будущее как правильнее... ) буду признателен...


Название: Re: [Решено] Как удалить Widget из layout'а
Отправлено: andrew.k от Декабрь 19, 2011, 06:59
Ну так не удаляй виджет!
Код
C++ (Qt)
while( (item = layout->itemAt(0)) )
{
layout->removeItem( item );
layout->removeWidget(item->widget());
//delete item->widget();
                       delete item;
layout->update();
}


Название: Re: [Решено] Как удалить Widget из layout'а
Отправлено: Morgoth от Сентябрь 01, 2012, 22:21
оживлю немного темку про QLayout...

если я удаляю добавленый на layout виджет, обязательно ли убирать его из layout?
вроде он и без этого прекрасно существует, он что сам несуществующие объекты удаляет?


Название: Re: [Решено] Как удалить Widget из layout'а
Отправлено: andrew.k от Сентябрь 01, 2012, 23:12
оживлю немного темку про QLayout...

если я удаляю добавленый на layout виджет, обязательно ли убирать его из layout?
вроде он и без этого прекрасно существует, он что сам несуществующие объекты удаляет?
при удалении виджета, он удаляется из лейаута.


Название: Re: [Решено] Как удалить Widget из layout'а
Отправлено: Morgoth от Сентябрь 02, 2012, 06:56
оживлю немного темку про QLayout...

если я удаляю добавленый на layout виджет, обязательно ли убирать его из layout?
вроде он и без этого прекрасно существует, он что сам несуществующие объекты удаляет?
при удалении виджета, он удаляется из лейаута.
ок, спасибо


Название: Re: [Решено] Как удалить Widget из layout'а
Отправлено: PavelVX от Сентябрь 18, 2012, 08:12
Теперь и я вмешаюсь в темку :) Есть виджет с такой компановкой:
Код:
//btnVBoxLayout - глобальная переменная, тип QVBoxLayout
    QVBoxLayout * mainVBoxLayout = new QVBoxLayout();
    QLabel * tstLabel = new QLabel("Тут могла быть ваша реклама :)", this);
    mainVBoxLayout->addWidget(tstLabel);
    mainVBoxLayout->addLayout(btnVBoxLayout);
    QHBoxLayout * bottomHBoxLayout = new QHBoxLayout();
    bottomHBoxLayout->addWidget(btnBack);
    bottomHBoxLayout->addWidget(btnRefresh);
    mainVBoxLayout->addLayout(bottomHBoxLayout);
    setLayout(mainVBoxLayout);
В btnVBoxLayout динамически добавляю/удаляю кнопки. При добавлении кнопок, виджет растет в высоту, как и надо. Но при удалении не стягивается. Уже крутил, вертел, не хочет уменьшаться. Подскажите, как его уменьшать-то?