我想将对象存储在QML ListModel中。这些对象具有多个属性。一些是简单的字符串,另一些是子对象,它们也具有我希望在QML ListView委托中访问的属性。
如果我使用在QML中创建的javascript对象执行此操作,则ListView委托可以使用包括子对象属性在内的所有属性。
function addJSObjects(){
var jsobj1 = {"name": "Aunt Agatha",
"displayLabel" : {"label" : "Agatha"}};
listModel.append(jsobj1);
}
e.g。在委托中, model.displayLabel.label 将返回“Agatha”。的 - >确定
但是,如果我对等效的C ++自定义对象执行相同操作,那么我会遇到问题。 我有一个对象“Contact”与属性displayLabel,它是自定义对象" ContactDisplayLabel"的一个实例。 (即该属性是子对象)。 这两个类均使用 Q_GADGET + Q_DECLARE_METATYPE + qRegisterMetaType 进行声明。
"联系" QML接收对象实例作为来自C ++
的信号的参数“contact”如果我像这样附加到QML ListModel:
onContactFound: {
console.log("onContactFound signal from C++ for " + contact.displayLabel.label);
listModel.append({"name": contact.name,
"displayLabel": contact.displayLabel});
}
然后在ListView委托中, model.name 可用,但未定义 model.displayLabel 。但是它已在上面的信号处理程序中定义并可用(由console.log()的输出证明。 - > NOT OK 。
如果我通过属性显式映射属性(实际上转换为javascript对象)附加到QML ListModel,如下所示:
onContactFound: {
console.log("onContactFound signal from C++ for " + contact.displayLabel.label);
listModel.append({"name": contact.name,
"displayLabel": {"label": contact.displayLabel.label}});
}
然后在ListView委托中定义 model.displayLabel ,并且可以访问 model.displayLabel.label 。的 - >确定
我的真实世界对象比上面的简化示例具有更多属性,但它们足够简单,可以采用这种实用的方法。
但是如果我的对象更复杂,如果它们有很多属性和深层嵌套的子对象会怎么样呢?
我想我可以放弃QML ListModel,并在C ++端创建一个QAbstractItemModel的子类来存储联系人,但我不愿意移动更多功能,然后从QML到C ++需要。有没有更好的方法来保持QML ListModel?