我正在Qt中开发一个top / htop克隆,用于显示远程设备上的进程。每秒传输一个新的进程列表,并导致表示客户端中的状态的内部QAbstractItemModel派生更新。这发生在一个循环中,它使用两个迭代器(一个用于旧列表,一个用于新列表),我同时迭代以比较条目并应用更改(即删除/插入/更新条目),如果需要的话。
我想知道每个beginInsertRows / beginRemoveRows调用是否必须在相应的更改后立即关闭endInsertRows / endRemoveRows调用,或者是否可以使用布尔标志指示确实已经发生插入/删除然后继续应用更多的插入/删除,并且只在结束时调用endInsertRows / endRemoveRows一次,具体取决于前面提到的标志。
由于模型中可能有大量条目可能已更改(反过来触发大量插入/删除),我对性能感到担忧,并且不希望模型通知视图进行更新,直到我我完成了所有插入/删除。
这是否可能或者我不应该关心这个因为Qt已经有一些内部优化来自动处理我不知道的情况?
编辑1:空行后发生崩溃似乎已回答了问题 可以在this image中看到。
答案 0 :(得分:0)
每当在中间插入一行时,至少会使随后几行的索引无效。
调用beginInsertRow()
通知视图,其存储/缓存的索引将以哪种方式无效。这种说法告诉我们模型正在过渡到中间/无效状态。
调用endInsertRow()
告诉视图,现在模型的内部状态有效并且可以查询。
不支持嵌套这些调用。
也许您应该改用begin/endResetModel()
。