按照标题的要求:
/api/test/
ListElement中的“名称”和“年龄”是任意属性。ListElement如何实现此目的? 这是我自己在C ++中定义的Qml类型:
ListModel {
ListElement {
name: "Jhon"
age: 100
}
}
有一个错误:无法分配给不存在的属性“ abc”。
我可以像ListElement一样实现我自己的类型吗?怎么样?
谢谢!
答案 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似乎是一种特殊的语言功能。
列表元素的定义与其他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的对象,但为模型对象扮演了两个角色。