在ListModel中传递一个数组

时间:2017-07-18 03:18:44

标签: javascript qml

我想知道如何在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 ListModelListElement文档中

没有提及任何关于获取所有关键值的权利吗?它只支持基于索引号的get(int index)

3 个答案:

答案 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