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"))