2016-11-13 42 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