为什么ListElement可以添加任意属性?

时间:2019-01-19 13:29:21

标签: qt qml

按照标题的要求:

/api/test/

ListElement中的“名称”和“年龄”是任意属性。ListElement如何实现此目的? 这是我自己在C ++中定义的Qml类型:

    ListModel {
        ListElement {
            name: "Jhon"
            age: 100
        }
    }

有一个错误:无法分配给不存在的属性“ abc”。

我可以像ListElement一样实现我自己的类型吗?怎么样?

谢谢!

2 个答案:

答案 0 :(得分:0)

如错误文本所示,如果要在C ++中定义属性,则需要使用Q_PROPERTY宏对其进行声明并为其提供方法(http://doc.qt.io/qt-5/properties.html)。

您还可以在QML中定义属性:

Test {
    property string name: "xxx"
}

ListElement的{​​{1}}和name不是任意属性,而是模型的角色(link)。

答案 1 :(得分:0)

让我回答我的问题!

在ListModel中使用ListElement似乎是一种特殊的语言功能

the ListElement Manual说:

  

列表元素的定义与其他QML元素一样 ,除了它们   包含角色定义而不是属性的集合。使用   与属性定义相同的语法 ...

事实证明,ListModel中的语法 ListElement {roleName:roleValue} 不会定义类型为ListElement的实例,而是一个List element 或list ListModel的项目

我运行了以下代码来证明我的观点。

QML:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    ListModel {
        objectName: "model"
        ListElement {
            objectName: "element"
            name: "abc"
        }
    }
}

CPP:

#include <QAbstractListModel>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtDebug>
int main(int argc, char* argv[])
{

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    for(const auto &rootObject:engine.rootObjects())
    {
        auto model = rootObject->findChild<QAbstractListModel*>("model");
        qDebug() << model;
        qDebug() << rootObject->findChild<QObject*>("element");

        if(model)
        {
            qDebug() << model->roleNames();
        }
    }

    return app.exec();
}

输出消息:

QML debugging is enabled. Only use this in a safe environment.
QQmlListModel(0x26c4e7c1500, name = "model")
QObject(0x0)
QHash((1, "objectName")(0, "name"))

看到了吗? ListModel实例化了一个名为model的对象。 ListElement并未创建名为element的对象,但为模型对象扮演了两个角色。