可以向ListModel添加复杂类型的项吗?

时间:2015-12-18 13:59:36

标签: json listview qml qtquick2

我希望有一个类似ListModel的结构来显示简单状态机的输入。每个输入可能包含多个字符串/整数。所以我需要ListModel的每个项目能够存储数据列表(包含输入参数名称的字符串,或带字符串的字典等)。目前,我无法将带有列表属性的项目附加到ListModel

所以ListModel看起来像这样:

ListView {
    anchors.fill: parent

    model: ListModel {
        id: listModel
    }

    delegate: Text {
        text: inputs[0]['name']
    }
}

当状态发生变化时,我想更新模型并追加这样的元素:

var state = {
    name: "abcd",
    inputs: [{name: 'a'}, {name: 'b'}, {name: 'c'}]
}
listModel.append(state);

当前版本的代码返回错误TypeError: Cannot read property 'name' of undefined。它没有看清单。

根据this question,在ListModel的项目中使用列表可能会出现问题。但这似乎与我的情况无关。也许我需要在QML中使用不同的列表和词组,也许我必须在委托(我试过)或其他东西(建议?)中写text: inputs[0].name

有人可以建议如何在ListModel中制作一个或多或少复杂的项目(基本上是标准的JSON)吗?目前尚不清楚,因为文档和博客/问题始终处理字符串。我错过了一些有用的文档吗?在QML中做什么是好的做法?我应该使用一些自定义对象吗?

1 个答案:

答案 0 :(得分:2)

根据documentation和您在命令式代码中正确执行的操作,可以将列表数据添加到ListElement。但是,嵌套角色不是真正的数组。他们自己ListModel。那是因为,by design,如果数组元素发生变化,QML不会产生通知,这将是模型视图委托设置中的show-stopper。

由于嵌套角色是模型,因此您可以使用模型的函数。例如,这个例子工作正常:

import QtQuick 2.5
import QtQuick.Window 2.2

Window {
    id: window
    width: 600
    height: 400
    visible: true

    ListView {
        anchors.fill: parent

        model: ListModel {
            id: listModel
        }

        delegate: Text {
            text: name + inputs.get(index % inputs.count).name  // accessing the inner model
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            var state = {
                name: "abcd",
                inputs: [{name: 'a'}, {name: 'b'}, {name: 'c'}]
            }
            listModel.append(state);
        }
    }
}

根据您的问题,输入是纯JSON。在这种情况下,请考虑使用JSONListModel代替ListModel。它通过JSONPath公开了一组匹配XMLListModel的API,并且可能代表您的场景的完美解决方案。