2016-11-15 89 views
1

如何从使用QML的委托之外的模型中获取数据(从QAbstractItemModel中分类)?通过QML中C++模型的索引获取数据

我想它是这样的:

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到我的模型。我应该如何在委托人之外的模型中访问数据? (特定行,特定角色)当我使用委托时,我的模型完美无缺。

回答

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++端实现。仅功能。

+0

不是通常的名字'get'而不是'at'?至少'ListModel'没有'at',只有'get'功能。 – derM

+0

非常感谢!使用我自己的方法来获取数据是一个很好的解决方案。 – Nulik

+1

@derM - 如果你打算拥有'set()',你一定会想'get()'。如果你不这样做,只要它完成了工作,这并不重要。在索引0的项目听起来对我来说很合适。 – dtech