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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как переиндексировать модель-вид?  (Прочитано 3942 раз)
Caduceus
Гость
« : Июль 03, 2012, 12:07 »

Удаляю один элемент дерева через beginRemoveRows-removeRows-endRemoveRows  - все нормаьно удаляется
Удаляю второй (который шел после первого) - падает на невалидном родителе, индексы слетели.

как после удаления переиндексировать?
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #1 : Июль 03, 2012, 17:09 »

есть такое, как подсказка может сойдет:
Код:
bool uoMetaModel::deleteNode(uoMetaNode *pNode, const QModelIndex &index)
{
    if(!index.isValid())
        return false;
    const QModelIndex parent = index.parent();
    uoMetaNode *ppNode = pNode->parent();
    int row = ppNode->m_children.indexOf(pNode);
    m_lastInsertedNode = 0;
    beginRemoveRows(parent,row,row);
    ppNode->m_children.removeAt(row);
    endRemoveRows();
    return true;
}
« Последнее редактирование: Июль 03, 2012, 17:16 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
sasha12345
Гость
« Ответ #2 : Июль 06, 2012, 16:12 »

Как раз тоже столкнулся с этой проблеммой, только у меня не дерево, а таблица в которой хочу удалить выделенные строки. Пока я сделал так:
1) Получаю выделенные индексы.
2) Из них выделяю номера строк
3) Сортирую полученные номера строк от большего к меньшему
4) Удаляю строки в модели с номерами из отсортированого списка.

Если кратко, то идея в том, чтобы удалять строки от большего к меньшему

Вообще, я не особо давно занимаюсь Qt, и чем глубже копаю, тем больше начинают выявляться недоработки. вот и сейчас, например появились такие вопросы:
1) Почему QItemSelectionModel возвращает СПИСКИ индексов, а в QAbstractItemModel НЕТ ф-ии удаления списка индексов?
2) Почему при удалении строки в QAbstractItemModel не происходит автоматического сдвига выделения в QItemSelectionModel?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 06, 2012, 18:37 »

Вообще, я не особо давно занимаюсь Qt, и чем глубже копаю, тем больше начинают выявляться недоработки.
Какой Вы талантливый! Недавно занимаетесь а уже нашли недоработки!  Улыбающийся

Есть контейнер данных и второй контейнер индексов по которым нужно удалить данные. Ну и удаляем
Код
C++ (Qt)
template <class T>
void RemoveByIndex( QVector <T> & data, QVector <int> & index, bool indexSorted )
{
if (!indexSorted)
 qSort(index.begin(), index.end());
 
for (int i = 0; i < index.size(); ++i)
 data.erase(data.begin() + index[i] - i);
}
 
Если не model-view, а просто контейнер данных, то можно написать лучше

Записан
sasha12345
Гость
« Ответ #4 : Июль 10, 2012, 17:49 »

Вообще, я не особо давно занимаюсь Qt, и чем глубже копаю, тем больше начинают выявляться недоработки.
Какой Вы талантливый! Недавно занимаетесь а уже нашли недоработки!  Улыбающийся

Есть контейнер данных и второй контейнер индексов по которым нужно удалить данные. Ну и удаляем
Код
C++ (Qt)
template <class T>
void RemoveByIndex( QVector <T> & data, QVector <int> & index, bool indexSorted )
{
if (!indexSorted)
 qSort(index.begin(), index.end());
 
for (int i = 0; i < index.size(); ++i)
 data.erase(data.begin() + index[i] - i);
}
 
Если не model-view, а просто контейнер данных, то можно написать лучше


Я не совсем увидел в этом примере именно model-view. Но вообще примерно это я и описал, т.е. смысл в сортировке. А не нравиться мне это вот по каким причинам:
1) Приходится вначале сортировать. почему бы в модели-селекторе не хранить уже в отсортированном виде.
2) Приходится удалять по одному элементу. А вдруг модель организована как линейный массив и каждое удаление - это копирование кучи элементов, а если элементов там уже очень много.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 10, 2012, 19:04 »

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


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