【问题标题】:Integrating your own QT C++ data model with QML将您自己的 QT C++ 数据模型与 QML 集成
【发布时间】:2016-11-19 19:36:46
【问题描述】:

我在将我的 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);
    ...
}

我有一个模型类来存储身份对象:

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() 也未执行。

问题可能出在哪里?

【问题讨论】:

    标签: c++ qt qml qtquick2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果我像你说的那样做,我会收到“ReferenceError: email is not defined”错误。我已经试过了
    • 强调“提供模型中的角色正确实现”部分。
    • 我认为问题出在代表身上。委托没有调用 data() 或 index() 方法,因此在模型类中没有执行任何操作。我到处都有断点,但没有调用
    • 对delegate没有特别要求,只要模型能工作,delegate就会工作,都是自动的。问题很可能出在您的模型上。
    • “这不是你使用角色的方式,项目角色不是列表对象的属性,你不做model.role你只是做角色。”这根本不是真的。当role 模棱两可时,您可以在代表中使用model.role(我相信这是一个更好的约定):doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html#models
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2020-10-24
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多