C++ Qt:从QabStretchListModel中删除多行

C++ Qt:从QabStretchListModel中删除多行,c++,qt,qabstractitemmodel,qabstractlistmodel,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

有没有一种方法可以有效地从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 ();
    }
}
//单行删除
无效删除(int idx){
开始删除(noParent(),idx,idx);
//内移
endrows();
}
//通过多次调用beginRemoveRows删除每一行
void removeMultiple(常量QList和项目){
foreach(自动项目,项目)
{
int idx=findIndexInternal(项目);
开始删除(noParent(),idx,idx);
//内移
endrows();
}
}
关于,请参见:

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

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


更新:我目前使用这个架构,它做到了这一点。您甚至不必发出删除/添加行的信号,因为这是由布局信号处理的。

什么是“高效”呢?你知道,通过模型/视图,你可以控制删除操作的功能,因此你可以对删除操作进行排队,对吗?@量子物理学家他仍然需要单独开始/结束删除操作。备选方法:调用reset(),但这会忘记视图中的选择、当前项(焦点)和其他内容。就我个人而言,我不会太担心。如果视图中的重新计算非常昂贵,它们可以使用零间隔计时器(参见抽象项视图中的延迟布局计时器)。@johanneschaub litb,这与效率无关。从GUI连续执行删除操作时,不会出现效率问题。例如,它并不比其他选项慢。这是一个图形用户界面!这不像人眼需要更快的速度。@Quantum物理学家如果QAbstractItemModel有一个
disableUpdates
或begin/endBatch函数,你可以很好地优化这种重复操作。我不明白“这是一个GUI,不像…”和“没有效率问题”-我不知道你怎么想知道。“我过去在项目视图中遇到过效率问题。@量子物理学家在不知道列表中有多少项目的情况下,忽略对效率的关注是错误的。”。e、 g.如果列表中有1000万个项目,那么删除200万个非连续项目可能需要很长时间,即使按照人眼标准。