将您自己的 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 给定索引的对象并访问该对象的属性。
我在将 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 给定索引的对象并访问该对象的属性。