2016-11-13 70 views
0

我在將C++數據模型暴露給QML中的ListView時遇到問題。 QML無法找到每一行的屬性。將您自己的QT C++數據模型與QML集成

我有這個類(QT 5.7):

class Identity : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged); 
    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged); 
    ... 
} 

而且我有一個存儲標識對象的模型類:

class Identities: public QAbstractItemModel { 
    Q_OBJECT 

private: 
    QMap<QString,Identity*>   identities_map; 
    ... 
} 

我也註冊它的main.cpp:

qmlRegisterType<Identities>("project_identities",1,0,"Identities"); 

我main.qml有以下定義:

Identities { 
    id: identidades 
} 
ListView { 
    anchors.fill: parent 
    model: identidades 
    delegate: Row { 
     Text { text: "Email: " + model.email} 
    } 
} 

現在的問題是,當我顯示的電子郵件和密碼的清單,這是輸出:

Email: undefined 

什麼我失蹤? 當我用調試器調試我的代碼時,唯一正在執行的方法是Identities :: rowCount()。不會執行Identities :: index(),也不會執行Identities :: data()。

問題在哪裏?

回答

1

提供該模型中的作用得到切實執行,所有你需要做的是:

Text { text: "Email: " + email}

如果還是不行的話,肯定你有你的模型實現的問題。

由於GrecKo在評論中指出的,格式model.role實際上是可能的,但不是真的有必要,除非你有名稱衝突。

+0

如果我像你說的那樣做,我會得到「ReferenceError:email is not defined」錯誤。我已經嘗試過了 – Nulik

+0

強調「在模型中提供角色是否正確實施」部分。 – dtech

+0

我認爲問題出在委託人身上。該委託不調用data()或index()方法,因此在模型類中不會執行任何操作。我在它的任何地方都有斷點,但沒有電話 – Nulik

0

您的模型要麼沒有正確地將角色名稱映射到角色值,即缺少或錯誤地執行QAbstractItemModel::roleNames()或者您的data()方法未正確處理角色值。

由於您的數據對象的似乎是QObject是你可以有一個返回指定索引的對象的單個示範作用,並訪問對象的屬性來代替。

+0

是的,這正是發生的事情! – Nulik