通过QML中的C ++模型索引获取数据

时间:2016-11-15 20:00:20

标签: c++ qt qml qtquick2

如何使用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());
    }
}

我尝试调试(放置一些断点),但无法从QML拦截对我的模型的Identities::data()Identities::index()的任何调用。我应该如何在委托之外的模型中访问数据? (特定行,特定角色)当我使用委托时,我的模型完全正常。

1 个答案:

答案 0 :(得分:2)

只需为模型实现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 ++端实现的任何运算符。仅限功能。