我想知道如何在ListModel中传递数组?
好的,在QML中我有一个ListView,我设置它ListModel
就像这样:
model: ListModel
{
id: myList
ListElement
{
name: ""
card: 0
books: []
}
}
我可以使用:
附加到它myList.append({name:"terry", card:00100, books:["024589","865976","879582","215645"]});
但是当我尝试在屏幕上输出时,我得到了这个。
{
"card": 00100
"books": {
"objectName": "",
"count": 4,
"dynamicRoles": false
},
"name": "terry",
"name": "terry"
}
我不知道为什么我会得到2个名字!我怎样才能获得书籍的价值?
我查看ListModel的QML文档,ListElement无法找到与传递数组相关的任何内容,所有示例都是整数或字符串。
知道如何获得约会吗?
我通过使用Component.onCompleted:{}
调用委托中的数组来解决这个问题,但我认为这不是一个好/正确的方法,因为委托不负责任要保存数据并且应该在模型中完成,如果我错了,请纠正我。
感谢您的时间。
Edit01:感谢您的回复,以下是我需要数组的原因: 我在委托中有 ComboBox ,如下所示:
delegate: Rectangle
{
id: rowID
width: 50
height: 40
color: "#323232"
Row
{
anchors.fill: parent
anchors.leftMargin: 10
anchors.rightMargin: 10
Label{
id: nameID
text: name
font.pixelSize: 12
width: 200
wrapMode: Text.WrapAnywhere
anchors.verticalCenter: parent.verticalCenter
color: "#999"
}
Label{
anchors.verticalCenter: parent.verticalCenter
text: "out:"
font.pixelSize: 12
color: "#999"
}
ComboBox{
id: booksID
height: 20
width: 50
model: books
anchors.verticalCenter: parent.verticalCenter
}
}
}
您可以看到我将名称提供给标签( ID:nameID )并且我想要提供<拥有模型的图书到 comboBox ( id:booksID ),如果我将图书键设为 ListElement < / strong>如何提供所有值?
在QML ListModel或ListElement文档中没有提及任何关于获取所有关键值的权利吗?它只支持基于索引号的get(int index)
。
答案 0 :(得分:1)
你做错了。数组成员必须是ListElement
:
ListModel {
id: mod
ListElement {
name: "ali"
dic: [ ListElement{text:"asad-o-llah"; code: 14}, ListElement{text:"aboo torab"; code: 72}, ListElement{text:"amir al-momenin"; code: 110}]
}
}
ListView {
model: mod
anchors.fill: parent
delegate: Component {
Rectangle {
width: parent.width; height: 50
Row {
Text {
text: name
}
ComboBox {
width: 100; height: 30
model: dic //<-- set dic as model for combo box
textRole: "text" //<-- important!
onCurrentIndexChanged: {
console.log("current code is "+model.get(currentIndex).code); //<-- get code value
}
}
}
}
}
}
Component.onCompleted: {
var v = mod.get(0).dic.get(0).value; //<-- sample usage
console.log(v);
}
答案 1 :(得分:1)
你想要一些类似的东西:
Rectangle {
id: root
visible: true
width: 360
height: 360
ListModel
{
id: myList
ListElement {
name: "Story"
card: 3
books: [
ListElement { bookName: "Story 1" },
ListElement { bookName: "Story 2" },
ListElement { bookName: "Story 3" }
]
}
ListElement {
name: "Novel"
card: 3
books: [
ListElement { bookName: "Novel 1" },
ListElement { bookName: "Novel 2" },
ListElement { bookName: "Novel 3" }
]
}
}
Component {
id: displayDelegate
Rectangle
{
id: rowID
width: 300 //50
height: 40
color: "#323232"
border.color: "white"
Row
{
anchors.fill: parent
anchors.leftMargin: 10
anchors.rightMargin: 10
Text{
id: nameID
text: name
font.pixelSize: 12
width: 50 //200
wrapMode: Text.WrapAnywhere
/*anchors.verticalCenter: parent.verticalCenter*/
color: "white"//"#999"
}
Text{
/*anchors.verticalCenter: parent.verticalCenter*/
text: "out:"
font.pixelSize: 12
color: "white"//"#999"
}
/*ComboBox{
id: booksID
height: 20
width: 50
model: books
anchors.verticalCenter: parent.verticalCenter
}*/
Repeater {
model: books
Text { text: bookName + "\t"; color: "white" }
}
}
}
}
ListView {
id: disp
anchors.fill: parent
model: myList
delegate: displayDelegate
}
}
我修改了你共享的几行代码。我不确定你的ComboBox实现。因此,我使用了自己的Repeater实现。您可以尝试执行并检查结果。
答案 2 :(得分:0)
作为使用ListModel和ListElement的替代方法,您还可以查看 QSyncable JsonListModel QML类型。 (它是Ben Lau的开源组件,您可以在GitHub上找到它:https://github.com/benlau/qsyncable)
JsonListModel是一种特殊的ListModel类型,可以处理您的JSON数组,例如在您的QML中创建或从REST服务获取。它会自动将JSON同步到QML ListModel,因此使用起来非常方便:
ListView {
id: listView
anchors.fill: parent
// property for json data, used as source for JsonListModel
property var jsonData: []
// use JsonListModel as model
model: JsonListModel {
source: listView.jsonData
keyField: "id"
}
// delegate
delegate: DelegateItem { /* ... */ }
}
您还可以在此处找到全面的指南:JsonListModel guide