2016-11-15 28 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