从 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>
.
我需要实现一个 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>
.