如何在ListView

时间:2016-03-25 21:07:51

标签: qt qml qsortfilterproxymodel

我有QSortFilterProxyModel可从我的QML代码访问。我在我的QML代码ListView中使用它,但我也希望在ListView之外访问它的第一个元素。

假设我打电话给QSortFilterProxyModel sortedObjects。在ListView我只是将它传递给model属性,如model: sortedObjects,然后在delegate属性中,我可以通过指定的角色名称访问它的角色。我怎样才能在ListView之外做到这一点?类似于sortedObjects[0].someRoleName

2 个答案:

答案 0 :(得分:3)

QSortFilterProxyModelQAbstractItemModel。在QAbstractItemModel中,您可以通过在QML中调用两个Q_INVOKABLE函数来访问模型中的元素:

  1. index获取QModelIndex,然后
  2. data获取该索引中角色的值
  3. 例如,假设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中有一个名为dataQSortFilterProxyModel的函数。不幸的是,如果我尝试在QML中的QSortFilterProxyModel上调用这些函数,那么我会收到以下错误:

TypeError: Property 'index' of object QSortFilterProxyModel(0x7fcff0c2af90) is not a function

因此建议this帖子。我创建了一个单独的C ++类,它接收我的QSortFilterProxyModel的const指针并创建一个函数,然后包装indexdata函数并返回所需的值。这个类已经注册,因此可以从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开始。