Russian Qt Forum

Qt => Model-View (MV) => Тема начата: nvek от Август 31, 2017, 11:23



Название: Поясните по поводу индексов в дереве
Отправлено: nvek от Август 31, 2017, 11:23
Например:
*
    1-1
        1-1-1
    1-2
        

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

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

если да. то почему у меня добавляются узлы уже развернутые, как прежде?


Название: Re: Поясните по поводу индексов в дереве
Отправлено: demaker от Август 31, 2017, 22:59
Как вы удаляйте элементы модели?
Посоле удаления вы модель обновляйте?


Название: Re: Поясните по поводу индексов в дереве
Отправлено: __Heaven__ от Сентябрь 01, 2017, 09:40
http://www.prog.org.ru/topic_31100_0.html
Посмотрите, как тут реализовано удаление узла.
TreeNode::removeChild
Сама модель в примере не имеет реализации метода удаления строк.


Название: Re: Поясните по поводу индексов в дереве
Отправлено: nvek от Сентябрь 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();
}

вот, тут что то не так с индексами, потому что когда я заново добавляю, индексы остаются


Название: Re: Поясните по поводу индексов в дереве
Отправлено: nvek от Сентябрь 13, 2017, 07:11
я скорее всего, да не скорее а точно, не совсем понимаю эту концепцию qt
ВНАЧАЛЕ я добавил индексы, а только потом добавил элементы.
но я более чем уверен, что проблема не в этом


Название: Re: Поясните по поводу индексов в дереве
Отправлено: nvek от Сентябрь 13, 2017, 08:42
Еще раз поясняю, стою на узле в котором есть под-узел в котором тоже под-узлы (на звездочке)
удаляю раскрытое поддерево, заново не добавляется (вылетает)
но если я удаляю не раскрытое дерево, то заново добавляется


Название: Re: Поясните по поводу индексов в дереве
Отправлено: nvek от Сентябрь 13, 2017, 10:03
Я понял, я в beginremov посылал первую строчку, всегда :) тоесть я добавлял и удалял индексы только первые строчки. Поэтому он поддерево и не удаляет


Название: Re: Поясните по поводу индексов в дереве
Отправлено: nvek от Сентябрь 13, 2017, 10:08
ЁПРСТ, как же долго это до меня доходило :D