我有QSortFilterProxyModel
可从我的QML代码访问。我在我的QML代码ListView
中使用它,但我也希望在ListView
之外访问它的第一个元素。
假设我打电话给QSortFilterProxyModel
sortedObjects
。在ListView
我只是将它传递给model
属性,如model: sortedObjects
,然后在delegate
属性中,我可以通过指定的角色名称访问它的角色。我怎样才能在ListView
之外做到这一点?类似于sortedObjects[0].someRoleName
。
答案 0 :(得分:3)
QSortFilterProxyModel
是QAbstractItemModel
。在QAbstractItemModel
中,您可以通过在QML中调用两个Q_INVOKABLE
函数来访问模型中的元素:
index
获取QModelIndex
,然后data
获取该索引中角色的值例如,假设someRoleName
的哈希值为1234(在模型中的roleNames
中定义)。您可以在第0行中获取someRoleName
的值(如果模型是列表,则为第0列),如QML中的以下函数:
function printSomeRoleNameInRow0()
{
var row = 0, col = 0, someRoleName = 1234;
var idx = sortedObjects.index(row, col);
var value = sortedObjects.data(idx, someRoleName);
console.log(value);
}
答案 1 :(得分:1)
正如@mcchu在帖子中指出的那样,index
中有一个名为data
和QSortFilterProxyModel
的函数。不幸的是,如果我尝试在QML中的QSortFilterProxyModel
上调用这些函数,那么我会收到以下错误:
TypeError: Property 'index' of object QSortFilterProxyModel(0x7fcff0c2af90) is not a function
因此建议this帖子。我创建了一个单独的C ++类,它接收我的QSortFilterProxyModel
的const指针并创建一个函数,然后包装index
和data
函数并返回所需的值。这个类已经注册,因此可以从QML代码中调用它。
以下是代码:
class SomeClass : public QObject {
Q_OBJECT
public:
SomeClass(const QSortFilterProxyModel* sortedModel) {
m_sortedModel = sortedModel;
}
Q_INVOKABLE QVariant getValue() {
QVariant someTypeRole = m_sortedModel->data(m_sortedModel->index(0, 0), SomeModelClass::SomeRoles::SomeTypeRole);
if (someTypeRole.isValid()) {
return type = someTypeRole.toString(); // I know it is a QString for sure, but there are mechanisms to find out the type of the role
}
return QVariant();
}
private:
const QSortFilterProxyModel* m_sortedModel;
};
编辑:
@Mitch在他的评论中指出@ mcchu的解决方案是有效的,但只能从Qt 5.5开始。