Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Caduceus от Июль 03, 2012, 12:07



Название: Как переиндексировать модель-вид?
Отправлено: Caduceus от Июль 03, 2012, 12:07
Удаляю один элемент дерева через beginRemoveRows-removeRows-endRemoveRows  - все нормаьно удаляется
Удаляю второй (который шел после первого) - падает на невалидном родителе, индексы слетели.

как после удаления переиндексировать?


Название: Re: Как переиндексировать модель-вид?
Отправлено: panAlexey от Июль 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;
}


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

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

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


Название: Re: Как переиндексировать модель-вид?
Отправлено: Igors от Июль 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, а просто контейнер данных, то можно написать лучше



Название: Re: Как переиндексировать модель-вид?
Отправлено: sasha12345 от Июль 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) Приходится удалять по одному элементу. А вдруг модель организована как линейный массив и каждое удаление - это копирование кучи элементов, а если элементов там уже очень много.


Название: Re: Как переиндексировать модель-вид?
Отправлено: Igors от Июль 10, 2012, 19:04
2) Приходится удалять по одному элементу. А вдруг модель организована как линейный массив и каждое удаление - это копирование кучи элементов, а если элементов там уже очень много.
Вот Вы по сути сами и ответили - что и как удалять решает удаляющий, и самостоятельно, нравится ему или нет. А как удалить без многократного копирования - Вы знаете