【问题标题】:Create a QModelIndex from a Data Item从数据项创建 QModelIndex
【发布时间】:2015-08-15 00:33:55
【问题描述】:

我正在寻找一种从模型中的特定数据创建 QModelIndex 的方法。我可以通过以下方式从 QModelIndex 转到数据项:

CustomData *data = static_cast<CustomData *>(modelIndex.internalPointer());

但我正在寻找一个反函数:

QModelIndex *index = createIndex(data); // ??

我已经实现了与简单树模型示例 (http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html) 非常相似的数据之间的链接。我的视图正确显示数据,但有相当大的滞后。我想发出 dataChanged(QModelIndex, QModelIndex) 以立即查看视图的更新,因为我认为延迟是由于等待视图更新。

在链接的示例中,我试图从 TreeItem 获取其在 QTreeModel 中的相应索引。

【问题讨论】:

  • 请展示CustomData的模型的完整实现。

标签: qt qtreeview qabstractitemmodel qmodelindex


【解决方案1】:

视图不会定期更新。它会根据需要进行更新,从您的模型的角度来看,这意味着任何事情。如果您的模型在项目更改其一个或多个数据角色值时没有发出dataChanged,那么您的模型就是损坏了。

要修复它,您有两种方法:

  1. 将行和列添加到CustomData。在添加/删除行/列时,您必须保持这些更新。

  2. 需要时,迭代项目的父项中的项目以查找子项 - 当您这样做时,您会从迭代项目的循环中获取行/列。

我认为你太努力了,通过。您很可能根本不需要实现CustomData - 只需使用QStandardItem 并将数据存储在变体中。然后,QStandardItemModel 为您处理迭代器和信号的所有细节。要在QStandardItem 用于存储的QVariant 中存储自定义数据类型,只需通过Q_DECLARE_METATYPE(YourType) 将其暴露给QVariant 机器。

您需要提供一个令人信服的论据,说明 QStandardItem 不知何故不足以满足您的需求。

【讨论】:

    【解决方案2】:

    您不能使用传统的指标,因为在模型/视图编程中它们不会一直存在,除非您使用:

    QPersistentModelIndex

    http://doc.qt.io/qt-5/qpersistentmodelindex.html#details

    此外,模型/视图编程还引入了许多新范例。关于它和使用它的文档有一个学习曲线......通读它几次并尝试使用与使用它们的 Qt Creator 捆绑的示例。

    更多关于使用QPersistentModelIndex

    http://doc.qt.io/qt-5/model-view-programming.html#using-model-indexes

    模型索引提供对信息片段的临时引用, 并可用于通过模型检索或修改数据。由于模型 可能会不时重组其内部结构,模型 索引可能会变得无效,不应存储。如果长期 需要引用一条信息,持久化模型 必须创建索引。这提供了对信息的参考 模型保持最新。提供临时模型索引 由QModelIndex 类提供,持久模型索引由 QPersistentModelIndex 类。

    要获得一个数据项对应的模型索引,三个 必须为模型指定属性:行号、列 编号,以及父项的型号索引...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多