Qt:从QAbstractListModel中删除多行

时间:2017-08-07 17:48:44

标签: c++ qt qabstractitemmodel 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 ();
    }
}

此致

1 个答案:

答案 0 :(得分:1)

请参见Qt's Model-View reference

此序列可用于任何结构更新,以代替 更多高级且方便的受保护方法。例如,如果 两百万行的模型需要删除所有奇数行, 即1个元素的1百万个贬义范围。这将是 可以使用beginRemoveRows和endRemoveRows一百万次,但是 那显然是低效的。相反,这可以表示为 一次布局更改,更新所有必要的持久索引 一次。

似乎您可以使用layoutAboutToBeChanged()layoutChanged()向基础模型发出较大的更改信号。我还没有测试过。

更新:我目前正在使用这种体系结构,并且可以解决问题。您甚至不必用信号通知行删除/添加,因为这是由布局信号处理的。