Return 来自 QAbstractItemModel 的自定义用户类型
Return custom user type from QAbstractItemModel
我有一个 QAbstractItemModel
包装了一些自定义数据(指针向量)。我将此模型与 QSortFilterProxyModel
、QTreeView
等一起使用。
当将一些其他逻辑连接到 selectionChange
信号时,我需要用户数据。不是对它的一些看法,而是指针本身。
我在数据方法中添加了一个特例。
QVariant data(const QModelIndex &index, int role) const override
当我将 -1 作为 role
传递时,我 return 指向变体中我的用户类型的指针。这很 hacky,必须有更好的 "official" 方法来做到这一点。
return 如何从 QModelIndex
等中获取基础模型数据?
谢谢。
唯一的问题是您显式传递了一个整数。我一直使用 return 指向实际对象的模型,只需指定一个特定的 dataObject
角色,或者您选择如何命名它。
您当前的方式实际上与 Qt 建议使用的方式非常接近:您将 -1 作为角色传递给模型以 return 您的自定义数据,而 Qt 鼓励您使用另一个值作用:Qt::ItemDataRole 枚举以 Qt::UserRole
项等于 0x0100
结束。正如文档所说,它是第一个可用于特定应用程序目的的角色。因此,您可以传递 Qt::UserRole
而不是将 -1 传递给模型。如果您需要使用其他类型的特定于应用程序的数据,请使用 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()
所示。
我有一个 QAbstractItemModel
包装了一些自定义数据(指针向量)。我将此模型与 QSortFilterProxyModel
、QTreeView
等一起使用。
当将一些其他逻辑连接到 selectionChange
信号时,我需要用户数据。不是对它的一些看法,而是指针本身。
我在数据方法中添加了一个特例。
QVariant data(const QModelIndex &index, int role) const override
当我将 -1 作为 role
传递时,我 return 指向变体中我的用户类型的指针。这很 hacky,必须有更好的 "official" 方法来做到这一点。
return 如何从 QModelIndex
等中获取基础模型数据?
谢谢。
唯一的问题是您显式传递了一个整数。我一直使用 return 指向实际对象的模型,只需指定一个特定的 dataObject
角色,或者您选择如何命名它。
您当前的方式实际上与 Qt 建议使用的方式非常接近:您将 -1 作为角色传递给模型以 return 您的自定义数据,而 Qt 鼓励您使用另一个值作用:Qt::ItemDataRole 枚举以 Qt::UserRole
项等于 0x0100
结束。正如文档所说,它是第一个可用于特定应用程序目的的角色。因此,您可以传递 Qt::UserRole
而不是将 -1 传递给模型。如果您需要使用其他类型的特定于应用程序的数据,请使用 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()
所示。