我有一个QAbstractItemModel
包装一些自定义数据(一个指针向量)。我将此模型与QSortFilterProxyModel
,QTreeView
等一起使用。
当将其他逻辑连接到selectionChange
信号时,我需要用户数据。不是它的一些观点,指针本身。
我在数据方法中添加了一个特例。
QVariant data(const QModelIndex &index, int role) const override
当我将-1作为role
传入时,我在变体中返回指向我的用户类型的指针。这是非常hacky,必须有一个更好的"官方"这样做的方法。
如何从QModelIndex
返回基础模型数据等?
谢谢。
答案 0 :(得分:3)
您当前的方式实际上与Qt建议使用的方式非常接近:您传递-1作为角色告诉模型返回您的自定义数据,而Qt鼓励您为角色使用另一个值:{{3枚举以Qt::UserRole
项等于0x0100
结束。正如文档所述,它是第一个可用于特定应用程序目的的角色。因此,不是将-1传递给模型,而是可以传递Qt::UserRole
。如果您需要使用其他类型的特定于应用程序的数据,请使用Qt::UserRole + 1
作为角色。对于其他人,您可以使用Qt::UserRole + N
。
然而,还有另一种方式:正如其中一条评论所指出的,如果你肯定知道视图中使用了哪个模型,你可以简单地将QAbstractItemModel
转换为你的特定模型并使用一些特定于模型的API提取您需要的数据:
void MyView::selectionChanged(const QItemSelection & selected, const QItemSelection & deselect)
{
MyModel * myModel = qobject_cast<MyModel*>(model());
if (!myModel) {
// Whoops, something went wrong, not the right model!
<...> // process it somehow
return;
}
<...> // Use myModel to retrieve the required data using convenient model-specific API
}
如果您需要从QModelIndex
获取模型,请使用上面qobject_cast
上显示的QModelIndex::model()
。
答案 1 :(得分:0)
关于它的唯一愚蠢的事情是你明确地传递一个整数。我使用的模型一直返回指向实际对象的指针,只需要指定一个特定的dataObject
角色,或者你选择命名它。