多个交错QAbstractItemModel :: beginInsertRows()/ beginRemoveRows()后跟一个endInsertRow()/ endRemoveRow()调用?

时间:2016-03-25 11:26:27

标签: c++ qt qabstractitemmodel

我正在Qt中开发一个top / htop克隆,用于显示远程设备上的进程。每秒传输一个新的进程列表,并导致表示客户端中的状态的内部QAbstractItemModel派生更新。这发生在一个循环中,它使用两个迭代器(一个用于旧列表,一个用于新列表),我同时迭代以比较条目并应用更改(即删除/插入/更新条目),如果需要的话。

我想知道每个beginInsertRows / beginRemoveRows调用是否必须在相应的更改后立即关闭endInsertRows / endRemoveRows调用,或者是否可以使用布尔标志指示确实已经发生插入/删除然后继续应用更多的插入/删除,并且只在结束时调用endInsertRows / endRemoveRows一次,具体取决于前面提到的标志。

由于模型中可能有大量条目可能已更改(反过来触发大量插入/删除),我对性能感到担忧,并且不希望模型通知视图进行更新,直到我我完成了所有插入/删除。

这是否可能或者我不应该关心这个因为Qt已经有一些内部优化来自动处理我不知道的情况?

编辑1:空行后发生崩溃似乎已回答了问题 可以在this image中看到。

1 个答案:

答案 0 :(得分:0)

每当在中间插入一行时,至少会使随后几行的索引无效。

调用beginInsertRow()通知视图,其存储/缓存的索引将以哪种方式无效。这种说法告诉我们模型正在过渡到中间/无效状态。

调用endInsertRow()告诉视图,现在模型的内部状态有效并且可以查询。

不支持嵌套这些调用。

也许您应该改用begin/endResetModel()