将您自己的QT C ++数据模型与QML集成

时间:2016-11-13 23:20:07

标签: c++ qt qml qtquick2

我在将我的C ++数据模型暴露给QML中的ListView时遇到了问题。 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);
    ...
}

我有一个存储Identity对象的模型类:

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()。

问题出在哪里?

2 个答案:

答案 0 :(得分:1)

正确实施模型中的角色,您只需要:

int compare_node( struct link_node *n1, struct link_node *n2) { return strcmp(n1->node_str, n2->node_str); }

如果这不起作用,那么你的模型实现肯定存在问题。

正如GrecKo在评论中指出的那样,格式Text { text: "Email: " + email}实际上是可行的,但除非你有名称冲突,否则不是必需的。

答案 1 :(得分:0)

您的模型要么没有正确地将角色名称映射到角色值,即QAbstractItemModel::roleNames()的遗漏或错误实施,或者您的data()方法未正确处理角色值。

由于您的数据对象似乎是QObject,因此您可以拥有一个模型角色,该角色返回给定索引的对象并改为访问该对象的属性。