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

Integrating your own QT C++ data model with QML

我在将 C++ 数据模型公开给 QML 中的 ListView 时遇到问题。 QML 找不到每一行的属性。

我有这个 class (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 存储身份对象:

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

问题可能出在哪里?

如果模型中的角色得到正确实现,您需要做的就是:

Text { text: "Email: " + email}.

如果这不起作用,那么您的模型实施肯定有问题。

正如 GrecKo 在评论中指出的那样,model.role 格式实际上是可能的,但除非您有名称冲突,否则并不是真正必要的。

您的模型没有将角色名称正确映射到角色值,即 QAbstractItemModel::roleNames() 的实现缺失或错误,或者您的 data() 方法没有正确处理角色值。

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