Qt: Удалить несколько строк из QAbstractListModel
Есть ли способ удалить несколько строк, которые не являются последовательными, эффективно из QAbstractListModel? Неэффективный пример:
// Single row removal
void remove (int idx) {
beginRemoveRows (noParent (), idx, idx);
// internal remove
endRemoveRows ();
}
// Remove each row by calling beginRemoveRows multiple times
void removeMultiple (const QList<QObject*> &items) {
foreach (auto item, items)
{
int idx = findIndexInternal(item);
beginRemoveRows (noParent (), idx, idx);
// internal remove
endRemoveRows ();
}
}
С Уважением,
0 ответов
Эта последовательность может использоваться для любого структурного обновления вместо более высокоуровневых и удобных защищенных методов. Например, если в модели с двумя миллионами строк необходимо удалить все нечетные пронумерованные строки, это составит 1 миллион несоответствующих диапазонов по 1 элементу в каждом. Можно было бы использовать beginRemoveRows и endRemoveRows 1 миллион раз, но это, очевидно, было бы неэффективно. Вместо этого об этом можно сигнализировать как об одном изменении макета, при котором сразу обновляются все необходимые постоянные индексы.
Кажется, вы можете использовать layoutAboutToBeChanged() и layoutChanged(), чтобы сигнализировать о больших изменениях в базовой модели. Однако я еще не тестировал это.
Обновление: в настоящее время я использую эту архитектуру, и она помогает. Вам даже не нужно сигнализировать об удалении / добавлении строки, поскольку это обрабатывается сигналом макета.