在QML中通过索引从c++模型中获取数据

Getting data by index from the C++ model in QML

本文关键字:c++ 模型 获取 数据 索引 QML      更新时间:2023-10-16

如何使用QML从委托之外的模型(QAbstractItemModel子类)中获取数据?

我试过了:

Identities {
    id: identities_model
}
...
console.log(identities_model[0].email)

但是我得到一个错误:

TypeError: Cannot read property 'email' of undefined

我的data()方法定义如下:

QVariant Identities::data(const QModelIndex &index, int role) const {
    int row_num;
    row_num=index.row();
    if (role==EmailRole) {
        QList <QString> qlist;
        qlist=identities_map.keys();
        if (row_num>=qlist.size()) return (QVariant());
        return QVariant(qlist.at(row_num));
    }
    if (role==PasswordRole) {
        QList <QString> qlist;
        qlist=identities_map.keys();
        if (row_num>=qlist.size()) return (QVariant());
        Identity *identity;
        identity=identities_map.value(qlist.at(row_num));
        return QVariant(identity->password());
    }
    if (role==Qt::DisplayRole) {
        return(QVariant());
    }
}

我试图调试(放一些断点),但无法拦截任何调用Identities::data()Identities::index()对我的模型从QML。如何在委托之外访问模型中的数据?(特定行,特定角色)当我使用委托时,我的模型工作得非常好。

只需为模型实现Identity * at(int index)槽或可调用函数。那么identities_model.at(0).email应该可以工作了。

角色在这里不起作用,因为您的IdentityQObject的派生,它应该将它们实现为属性,以便在QML中使用。角色仅适用于视图委托。如果它不是QObject派生的,则可以使用Q_GADGET为该类型生成元信息,以便从QML访问它。

如果你的模型是JS数组,[]操作符将工作。此外,JS不会抱怨你的模型没有[]操作符,它会简单地给你一个undefined,因为它是未定义的。同样的方法也适用于以下内容:

  var v = 3
  console.log(v[0])

JS不支持操作符重载,也不支持任何在c++端实现的操作符。功能。