crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> удаления Layout со всем его содержимым
votan
  опции профиля:
сообщение 15.10.2009, 16:48
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, возникла очередная проблема, при попытке удалить лайаут, удаляются виджеты а фон которым они были покрашены остается
есть такая иерархия лайутов:
все лайауты типа 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");)

еще раз опишу проблему, при удалении лайаута setLayout с надеждой что удалится все содержимое, удаляется все кроме фона у MyTileWidget

удаление
void Table::slotDeleteSet()
{
    int sizeLayout=setsLayout->count(); // получаем кол-во setLayout
            if(setsLayout->takeAt(sizeLayout-1)!=0 && sizeLayout!=0)
               delete setsLayout->takeAt(sizeLayout-1);
    repaint(rect());
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 7)
ViGOur
  опции профиля:
сообщение 16.10.2009, 15:22
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


А после удаления ты вызываешь перерисовку для главного виджета, на котором лежал лайоут с виджетами?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 16.10.2009, 16:12
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


Сообщение отредактировал votan - 16.10.2009, 16:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.10.2009, 17:03
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Попробуй:
void QLayout::update ()
void QWidget::repaint ()
void QWidget::update ()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 16.10.2009, 19:15
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


почему-то ему пофиг на мои repaint и upadate

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());
           }
    repaint(rect());
    qDebug()<<"**DELETE!**";
        for(int i=0;i<setsLayout->count();++i){
        qDebug()<<setsLayout->itemAt(i)->layout()->metaObject()->className();
    }
    qDebug()<<"**DELETE**";
}


вот как выглядит мусор оставленный удаленными виджетами
Прикрепленное изображение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 17.10.2009, 19:40
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


решение пришло из просто проехать внутри каждого вложенного лэйаута с удалением всех виджетов :)
 bool flag=true;

    while(flag)
    {
        int size = set->layout()->count();
        if(!size)
            break;
        delete set->layout()->itemAt(size-1)->widget();
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 18.10.2009, 11:08
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Вот код из документации, это ни одно и то же разве?

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


Оттуда же:

 CardLayout::~CardLayout()
{
      QLayoutItem *item;
      while ((item = takeAt(0)))
          delete item;
}


Сообщение отредактировал SABROG - 18.10.2009, 11:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 18.10.2009, 17:31
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


ну да, просто я пытался удалить вложенный лэйаут из лэйаута без удаления его содержимого :), что приводило к тому что виджеты просто повисали на заднем фоне, тк как я думаю потеряв свой лэйаут они потеряли ориентацию и связь с внешним миром :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 7:56