QAbstractItemModel更改开始/结束功能之外的后备数据

时间:2018-05-26 07:26:14

标签: c++ qt

TL; DR :如何修改QAbstractItemModel / beginInsertRows函数之外的子类o endInsertRows的后备数据结构,我可以移动实际的修改在它之前或之后支持arrey?这需要,因为支持数据结构通常通过其自己的接口进行修改,而QAbstractItemModel仅作为其集成到Qt GUI的视图。

我的应用程序中有一些类似树的数据模型。我有Qt数据模型继承自QAbstractItem模型,将其与Qt树控件链接。 基础数据模型会独立更改,因为在应用程序中随处使用它会太麻烦。

问题本身: 当其中一个元素的子集发生变化时,基础数据模型会发出信号。我将Qt数据模型与此信号连接起来。并且只删除代表该项目的索引。项目本身仍然存在于初始数组中,并且仅在发出结束后才被删除。这会导致Qt在包含指向已删除实体的指针时尝试在事件循环的下一次迭代中引用相同的索引。

问题是: 当实际数据存储受某些外部信号或代码影响时,有没有办法正确更新Qt数据模型中的索引?文档说只允许在相应的开始/结束调用之间添加/删除/移动元素。但是,就我而言,如果可能的话,这将非常麻烦。

2 个答案:

答案 0 :(得分:0)

您提到索引包含指向基础项的指针,当您可以使用QAbstractItemModel工具通知视图有关删除时,该指针已被删除。所以我想你使用QModelIndex::internalPointerQAbstractItemModel的行/列/父概念映射到原始底层模型的项目。

除此之外,您可以使用QModelIndex::internalId将基础模型中的项目映射到QAbstractItemModel的索引。与悬空指针不同,唯一标识符可用于在任何时候安全地检查项目是否存在于基础模型中。如果它不存在,则始终可以从QVariant方法返回空QAbstractItemModel::data。它可能仍然会出人意料地#34;作为一些项目的观点'值将从视图后面的实际值变为空值 - 但它仍然比处理可能悬空的指针要好得多。

答案 1 :(得分:0)

我设法以这样的方式重构逻辑:内部模型发送事件对,一个在实际操作之前,一个在之后。改变内部包装器对象的逻辑允许在那些"事件括号"之间删除它们,有效地解决问题。谢谢大家的时间。