2

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

问候,

4

1 回答 1

1

请参阅Qt 的模型视图参考

此序列可用于任何结构更新,以代替更高级和方便的受保护方法。例如,如果一个有 200 万行的模型需要删除所有奇数行,那就是 100 万个折扣范围,每个范围有 1 个元素。可以使用 beginRemoveRows 和 endRemoveRows 100 万次,但这显然效率低下。相反,这可以作为单个布局更改发出信号,一次更新所有必要的持久索引。

看来您可以使用layoutAboutToBeChanged()layoutChanged()来表示对基础模型的重大更改。不过,我还没有对此进行测试。

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

于 2020-01-17T06:37:08.210 回答