多个交错的QAbstractItemModel::beginInsertRows()/beginRemoveRows(

Multiple interleaving QAbstractItemModel::beginInsertRows()/beginRemoveRows() followed by a single endInsertRow()/endRemoveRow() call?

本文关键字:beginInsertRows beginRemoveRows QAbstractItemModel      更新时间:2023-10-16

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

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

由于模型中潜在的大量条目可能已经更改(进而触发大量插入/删除),我担心性能,不希望模型在完成所有插入/删除之前通知视图进行更新。

这可能吗?我不应该关心这一点,因为Qt已经有了一些内部优化,可以自动处理我不知道的这种情况?

编辑1:空行后面跟着崩溃似乎回答了这个问题如图所示。

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

调用beginInsertRow()告诉视图其存储/缓存的索引将被无效,以及以何种方式无效。它在某种程度上告诉了模型正在转变为中间/无效状态的观点。

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

不支持嵌套这些调用。

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