Qt:从QAbstractListModel中删除多行

Qt: Remove multiple rows from QAbstractListModel

本文关键字:删除 QAbstractListModel Qt      更新时间:2023-10-16

有没有办法从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 ();
}
}

问候

参见Qt的模型视图参考:

此序列可用于任何结构更新,以代替 更高级、更方便的保护方法。例如,如果 两百万行的模型需要删除所有奇数行, 即 100 万个折扣范围,每个范围 1 个元素。这将是 可以使用开始删除行和结束删除行 100 万次,但是 这显然是低效的。相反,这可以表示为 单个布局更改,可更新所有必要的持久索引 立即。

似乎您可以使用 layoutAboutToBeChanged(( 和 layoutChanged(( 来表示对底层模型的重大更改。不过,我还没有测试过这个。

更新:我目前使用此架构,它可以解决问题。您甚至不必发出删除/添加行的信号,因为这是由布局信号处理的。