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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поясните по поводу индексов в дереве  (Прочитано 5532 раз)
nvek
Гость
« : Август 31, 2017, 11:23 »

Например:
*
    1-1
        1-1-1
    1-2
        

удаляю всех детей у звездочки (рута  предположим)
Код:
beginInsertRows(parentIndex, 0, count-1);
endInsertRows();

элемент с именем 1-1-1 удалит свой индекс?
я ведь "сузил" только верхне индексы, а что касательно вложенного, будет ли он тоже стерт?

если да. то почему у меня добавляются узлы уже развернутые, как прежде?
« Последнее редактирование: Август 31, 2017, 11:38 от nvek » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #1 : Август 31, 2017, 22:59 »

Как вы удаляйте элементы модели?
Посоле удаления вы модель обновляйте?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Сентябрь 01, 2017, 09:40 »

http://www.prog.org.ru/topic_31100_0.html
Посмотрите, как тут реализовано удаление узла.
TreeNode::removeChild
Сама модель в примере не имеет реализации метода удаления строк.
Записан
nvek
Гость
« Ответ #3 : Сентябрь 13, 2017, 06:06 »

с определенной периодичностью запрашиваю данные с сервера
Удаляю вот так вот:
покажу полный стек вызовов
1) метод  bool isChildrenChange() {
Код:
//где то в дебрях кода, когда я нахожу сколько добавилось, а сколько ушло
if (added > 0 || deleted > 0)
{
if (added > deleted)
{
emit sg_addedChildren(added - deleted, this);
return true;
}

if (deleted > added)
{
emit sg_removeChildren(deleted - added, this);
return true;
}
return false;
}
return false;

2) в этом же классе
Код:
void sl_removeChildren(int count, ItreeItem* item)
{
//отправить что дерево где то изменилось
//emit
ItreeItem* _item = item;
while (_item->getParent()->getParent())
_item = _item->getParent();


        //ибо я подписал только рутовый элемент на изменение
emit _item->sg_removeChildren(count, item);
//_item->sg_removeChildren(count, item);
}
3) дальше идет QAbstractItemModel
Код:
sl_removeChildren(int count, ItreeItem* parent)
{
QModelIndex parentIndex = QModelIndex();

parentIndex = createIndex(parent->getParent()->indexOfChild(parent), 0, parent);
beginRemoveRows(parentIndex, 0, count - 1);



endRemoveRows();
}

вот, тут что то не так с индексами, потому что когда я заново добавляю, индексы остаются
Записан
nvek
Гость
« Ответ #4 : Сентябрь 13, 2017, 07:11 »

я скорее всего, да не скорее а точно, не совсем понимаю эту концепцию qt
ВНАЧАЛЕ я добавил индексы, а только потом добавил элементы.
но я более чем уверен, что проблема не в этом
Записан
nvek
Гость
« Ответ #5 : Сентябрь 13, 2017, 08:42 »

Еще раз поясняю, стою на узле в котором есть под-узел в котором тоже под-узлы (на звездочке)
удаляю раскрытое поддерево, заново не добавляется (вылетает)
но если я удаляю не раскрытое дерево, то заново добавляется
Записан
nvek
Гость
« Ответ #6 : Сентябрь 13, 2017, 10:03 »

Я понял, я в beginremov посылал первую строчку, всегда Улыбающийся тоесть я добавлял и удалял индексы только первые строчки. Поэтому он поддерево и не удаляет
Записан
nvek
Гость
« Ответ #7 : Сентябрь 13, 2017, 10:08 »

ЁПРСТ, как же долго это до меня доходило Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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