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

Qt 为什么ListElement可以添加任意属性?,qt,qml,Qt,Qml,正如标题所问: ListModel { ListElement { name: "Jhon" age: 100 } } ListElement中的“name”和“age”是任意属性。ListElement是如何实现这一点的? 这是我自己在C++中定义的Qml类型: Test{ name:"xxx" //name is not defined with Q_PROPERTY }

正如标题所问:

    ListModel {
        ListElement {
            name: "Jhon"
            age: 100
        }
    }
ListElement中的“name”和“age”是任意属性。ListElement是如何实现这一点的? 这是我自己在C++中定义的Qml类型:

Test{
        name:"xxx" //name is not defined with Q_PROPERTY
    }
出现错误:无法分配给不存在的属性“abc”

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


谢谢

>P>错误文本建议,如果您想定义C++中的属性,则需要用“代码> QyFalth宏声明它并提供它的方法()) 您还可以在QML中定义属性:

Test {
    property string name: "xxx"
}

liselement
name
age
不是任意属性,而是模型的角色()

让我回答我的问题

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

正如上面所说:

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

因此,ListModel中的语法ListElement{roleName:roleValue}不会定义ListElement类型的实例,而是定义ListModel的List元素或List

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

QML:

CPP:


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

最好的方法是查看源文件:,我搜索了源文件以查找答案。但我没有找到答案。我发现ListElement类型的定义没有什么特殊之处。我想答案不在定义文件中,但是关于配置的,我不知道。
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"
        }
    }
}
#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"))