从 QAbstractItemModel 子类中检索原始项目

Retrieving original item from QAbstractItemModel subclass

我需要实现一个 QAbstractListModel subclass,这样我就可以在我们项目的域 class 中使用 QListView。

文档很好地涵盖了我必须提供的方法,但令我困惑的是没有明显的方法来检索特定 QModelIndex 的原始对象。

我要找的是这样的:

model MyModel<MyDomainEntity>(listOfDomainEntities);
model.item(someIndexComputedFromSelection); // Should return a MyDomainEntity

MyDomainEntity ent = model.data(someIndexComputedFromSelection, Qt::ItemRole)
                          .value<MyDomainEntity>();

但是除了自己实现这些模型方法之外,我找不到任何简单的方法来做到这一点。我错过了什么吗?

您必须将 MyDomainEntity 插入 QMetaType 系统。这将自动使 QVariant 也支持它。这就是您问题中的代码正常工作所需的全部内容。

您只需要:

// Interface
struct MyDomainEntity {
   int a;
};
Q_DECLARE_METATYPE(MyDomainEntity)

int main() {
   QVariant f;
   f.setValue(MyDomainEntity{3});
   Q_ASSERT(f.value<MyDomainEntity>().a == 3);
}

它还使 QVariant 能够携带您类型的 Qt 容器,例如QList<MyDomainEntity>.