问候,
我一直在编写一些讨厌的代码来支持从我的模型中删除任意一组对象的撤消/重做。我觉得我做对了,因为所有其他的修改器(添加/复制粘贴)都是这个功能的子集。
代码比我需要的更糟糕,主要是因为改变模型的唯一方法是调用 beginInsertRows/beginRemoveRows 并删除一个范围内的行(一次只做 1 行,无需将“邻居”优化为单个打电话呢)
beginInsertRows/beginRemoveRows 的问题是删除一行可能会影响另一个 QModelIndex(例如,缓存在列表中的一个)。例如:
ParentObj
->ChildObj1
->ChildObj2
->ChildObj3
假设我选择 ChildObj1 和 ChildObj3 并删除它们,如果我先删除 ChildObj1,我已经更改了 ChildObj3 的 QModelIndex(行现在不同)。如果我删除父对象(但我已通过从对象列表中“修剪”子对象来解决此问题),则会出现类似问题。
以下是我考虑过解决此界面限制的方法,但我想在继续前进之前我会要求更好的方法:
移动“向后”,假设提供的 QModelIndices 列表是从上到下排序的,只是从下往上。这确实需要可靠的排序,并且排序可能是幼稚和缓慢的(也许有一种对 QModelIndexes 集合进行排序的聪明方法?或者 QItemSelectionModel 提供好的(有序)列表?)
每次删除/添加对象时更新其他 QModelIndeces(想不出非天真的解决方案,搜索列表,在需要的地方获取新的 QModelIndeces)
由于更新实际数据很容易,只需更新数据并重建模型即可。这看起来很奇怪,我可以想象它在处理大量数据时会变得很慢。
这些是我目前的想法。我现在正在研究选项 1。
问候,丹 O