列表中的QML渲染列表

问题描述 投票:0回答:1

我的简化代码是

import QtQuick 2.0

Item {

    ListModel {
        id: items_model
        dynamicRoles: true
    }

    Component.onCompleted: {
        var data = {
            "items": [{
                    "name": "test1",
                    "rows": ["1", "2", "3"]
                }, {
                    "name": "test2",
                    "rows": ["1", "2", "3"]
                }, {
                    "name": "test3",
                    "rows": ["1", "2", "3"]
                }]
        }

        data.items.forEach(function (element) {
            items_model.append(element)
            console.log(element.rows)
        })

        console.log(items_model.count)
    }

    ListView {
        orientation: ListView.Horizontal

        model: items_model
        delegate: Item {

            height: parent.height
            width: 50

            Column {
                anchors.fill: parent
                Text {
                    text: name
                }

                Repeater {
                    model: rows
                    delegate: Text {
                        text: rows.get(index) + " " + index
                        Component.onCompleted: {
                            console.log(rows.get(index))
                        }
                    }
                }
            }
        }
    }
}

但我有DynamicRoleModelNode,而不是文本。

qml: DynamicRoleModelNode(0x563014585300)
qml: DynamicRoleModelNode(0x563014585330)
qml: DynamicRoleModelNode(0x563014585360)
qml: DynamicRoleModelNode(0x563014570350)
qml: DynamicRoleModelNode(0x563014570380)
qml: DynamicRoleModelNode(0x5630145703b0)
qml: DynamicRoleModelNode(0x563014558e00)
qml: DynamicRoleModelNode(0x563014558e30)
qml: DynamicRoleModelNode(0x563014558e60)

modelData 未提供,因为 rows 转为 QQmlListModel

我如何从中提取文本?

qt qml qt5 qtquick2
1个回答
1
投票

看看这里关于模型的文档。

https:/doc.qt.ioqt-5qtquick-modelviewsdata-modelview.html#models

特别是。

没有命名角色的模型(如下面所示的ListModel)将通过modelData角色提供数据。modelData 角色也为只有一个角色的模型提供。在这种情况下,modelData角色包含与命名角色相同的数据。

因此,在您的案例中,您正在寻找的字符串数据将被提供在一个叫做 modelData 在此背景下 Text 组件。

请注意,在您的特定情况下,这不能直接完成,因为ListModel正在转换子角色 items 变成一个ListModel本身,而不是一个StringList模型。这可能是Qt中的一个bug,因为你会认为你通常应该在那里得到一个StringList。

为了解决这个问题,你可以将你的子项目存储在一个单独的地图中,然后直接应用到Repeater中,这样你就可以正确地得到一个StringList模型,然后modelData就可以正常工作了。

类似这样。

    property var itemsMap: ({
                                "test1": ["1", "2", "3"],
                                "test2": ["1", "2", "3"],
                                "test3": ["1", "2", "3"]
                            })

    Item {

        ListModel {
            id: items_model
            dynamicRoles: true
        }

        Component.onCompleted: {

            var data = {
                "items": [{
                        "name": "test1"
                    }, {
                        "name": "test2"
                    }, {
                        "name": "test3"
                    }]
            }

            data.items.forEach(function (element) {
                items_model.append(element)
            })

            console.log(items_model.count)
        }

        ListView {
            orientation: ListView.Horizontal

            model: items_model
            delegate: Item {

                height: parent.height
                width: 50

                Column {
                    anchors.fill: parent
                    Text {
                        text: name
                    }

                    Repeater {
                        model: itemsMap[name]
                        delegate: Text {
                            text: modelData
                        }
                    }
                }
            }
        }
    }

1
投票

作为变通方法,把文本包到对象上

    data.items.forEach(function (element) {
        element.rows.forEach(function (item, index) {
              element.rows[index] = {text: item}
        })

        items_model.append(element)
    })

Repeater {

                model: rows
                delegate: Text {
                    text: text
                }
          }
© www.soinside.com 2019 - 2024. All rights reserved.