ListView {
id: listView
model: someModel {}
delegate: Loader {
id: delegateLoader
source: {
var where;
if(model.type === 1) {
where = "RadioQuestion.qml";
}
else
where = "TextQuestion.qml";
if(delegateLoader.status == Loader.Ready) {
delegateLoader.item.question= model.question;
}
return Qt.resolvedUrl(where);
}
}
我使用ListView
向用户显示了一些问题。但我无法访问Loader加载的委托成员。
RadioQuestion.qml
具有单选按钮,文本只是文本字段。我只想在按下提交按钮后得到所有答案,但我无法弄清楚如何在代表之间进行遍历。
也许我的方法是建立这种结构的错误。因此,我愿意接受更好的解决方案。
答案 0 :(得分:1)
您的question
已经通过模型公开,因此您的委托应直接绑定到它,因此假设question
是模型的属性:
// from inside the delegate
question: delegateRootId.ListView.view.model.question
或假设该问题是列表元素角色:
// from inside the delegate
question: model.question
如果你足够小心,不要在委托question
内命名属性,从而影响模型角色,你可以简单地说:
// from inside the delegate
questionSource: question
更不用说如果您的模型"计划"是已知的,并且您将拥有question
角色并且该角色将显示在代理中,您甚至不需要代理中的任何其他属性开始,您可以绑定实际项目直接到问题,例如:
// from inside the delegate
Text { text: question }
这就是他们真正需要的。
或者,您可以使用Binding
或Connections
元素或简单的信号处理程序来延迟操作,直到加载程序实际完成加载。例如:
delegate: Loader {
source: Qt.resolvedUrl(model.type === 1 ? "RadioQuestion.qml" : "TextQuestion.qml")
onStatusChanged: if (status === Loader.Ready) if (item) item.question= model.question
}
答案 1 :(得分:0)
Button {
text: "Submit answers"
onClicked: {
for(var child in listView.contentItem.children) {
var c = listView.contentItem.children[child].item;
if(typeof c !== "undefined")
console.log(c.answer)
}
}
}
您可以像这样获取加载程序委托的属性。我们使用“undefined
”检查,因为contentItem
的子项中的一个对象未定义。这是列表中的第二个对象,我不知道为什么。