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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: полное удаление содержимого лайаута  (Прочитано 8927 раз)
votan
Гость
« : Октябрь 16, 2009, 21:49 »

Здравствуйте, возникла проблема, при попытке удалить лайаут, удаляются виджеты а рамка которая отрисовывалась вокруг виджета остается на месте, как будто её отрисовали на главном виджете
есть такая иерархия лайутов:
все лайауты типа QHBoxLayout и QVBoxLayout(кнопки)
Layout:
1)ButtonsLayout
       a)addPonPushButton
       b)addChiPushButton
       c)addKanPushButton
       d)addPairPushButton
       e)deleteTailPushButton
       f)analyseHandPushButton

2)SetsLayout
   a)setLayout(0-4шт)
      *Chi/Pon/Kan/PairSetWidget
         *tileLayout
              *(от 2х до 4х) MyTileWidget(каждый покрашет в красный цвет по средством setStyleSheet("background-color: red")Подмигивающий

Код:
void Table::slotDeleteSet()
{
       int sizeLayout=setsLayout->count(); // получаем кол-во setLayout
            if(setsLayout->takeAt(sizeLayout-1)!=0 && sizeLayout!=0){
               delete setsLayout->takeAt(sizeLayout-1);
               setsLayout->update();//пытаемся обновить тот на который содержит лэйауты для удаления
               layout->update();//пытаемся обновить главный
               repaint(rect());//перерисовать все окно
               update(rect());//обновить все окно
           }
}

на одной картинке показан мусор который остается после удаления, на другой структура лэйаутов
Записан
_OLEGator_
Гость
« Ответ #1 : Октябрь 16, 2009, 22:11 »

Для простоты понимания вопроса и ускорения решения проблемы рекомендую выложить минимальный проект, в котором присутствует проблемная часть.

Также если вы хотите понимать и разбираться в том, что написали, то надо хотя бы в ассистент заглядывать, потому что вот это
Код
C++ (Qt)
setsLayout->update();//пытаемся обновить тот на который содержит лэйауты для удаления
layout->update();//пытаемся обновить главный
repaint(rect());//перерисовать все окно
update(rect());//обновить все окно
 
избыточно
repaint и update - вызывать достаточно  одно из них, repaint вызовет немедленную перерисовку окна, а при update перерисовка вызовется, когда обработка перейдет в основной цикл рисования...
Записан
SLiDER
Гость
« Ответ #2 : Октябрь 17, 2009, 01:18 »

Здравствуйте, возникла проблема, при попытке удалить лайаут, удаляются виджеты а рамка которая отрисовывалась вокруг виджета остается на месте, как будто её отрисовали на главном виджете

Удаление лэйаута не приводит к удалению связанных с ним виджетов, ибо он не является (и не может быть, так как не является виджетом) их парентом.
Записан
votan
Гость
« Ответ #3 : Октябрь 17, 2009, 19:39 »

спасибо за подсказку Смеющийся
все решилось банально просто, просто проехать внутри каждого вложенного лэйаута с удалением всех виджетов
Код:
    bool flag=true;

    while(flag)
    {
        int size = set->layout()->count();
        if(!size)
            break;
        delete set->layout()->itemAt(size-1)->widget();
    }
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Октябрь 18, 2009, 13:52 »

Удаление лэйаута не приводит к удалению связанных с ним виджетов, ибо он не является (и не может быть, так как не является виджетом) их парентом.

ну здрасте Улыбающийся

Цитировать
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.
Записан
SLiDER
Гость
« Ответ #5 : Октябрь 19, 2009, 23:20 »

Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.
[/quote]

Забавный ноут  Непонимающий Как-то необращал раньше на него внимания. Однако, как тогда объяснить тот факт, что после удаления лэйаута удления положенных на него компонентов непроисходит? Надо почитать исходники  Непонимающий Насколько я помню, по Qt-шным правилам, своих детей удаляет родитель, а родителем виджету может быть только виджет, и мне казалось что лэйаут транслирует положенные на него виджеты в дети своего виджета. Странный ноут  Непонимающий
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Октябрь 19, 2009, 23:38 »

>>а родителем виджету может быть только виджет, и мне казалось что лэйаут транслирует положенные на него
>>виджеты в дети своего виджета.
Если пытатся получить родителя виджетов лежащих в компоновщике, то возвращается именно виджет в который помещён данный компоновщик.

Так что, я думаю, в доку вкралась ложная информация, либо неполная
Записан

Юра.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Октябрь 20, 2009, 00:16 »

ну здрасте Улыбающийся

Да, итем удалится, но где сказано что удаляется имеено виджет?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Октябрь 20, 2009, 00:54 »

Если пытатся получить родителя виджетов лежащих в компоновщике, то возвращается именно виджет в который помещён данный компоновщик.

Так что, я думаю, в доку вкралась ложная информация, либо неполная

да, всё верно, я сейчас точно проверил - если удалить layout, то занесённые в него виджеты не удаляются, запись в доке вносит небольшую сумятицу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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