【问题标题】:Model of horizontal listview inside vertical listview垂直列表视图内的水平列表视图模型
【发布时间】:2016-06-01 09:23:55
【问题描述】:

我想将水平列表视图作为垂直列表视图的代表。是否可以从 C++ 将不同的模型附加到水平列表视图?

 ListView {
            id: eventList
            model: N (N tells how many horizontal lists are there)
            delegate:
                ListView {
                id: horizontall
                model: ?? // How to attach different model from C++ to each horizontal list
                orientation: ListView.Horizontal

在 c++ 部分中,我实现了 N 个从 QAbstractlistmodel 派生的 QList 列表

【问题讨论】:

    标签: c++ listview model qml qt5


    【解决方案1】:

    是的,这是可能的。不可能创建一个包含另一个ListModelListModel。至少在 QML 中是不可能的。

    这里是如何制作它的快速而肮脏的例子。它解决了你的问题吗?

    import QtQuick 2.4
    import QtQuick.Controls 1.4
    import QtQuick.Layouts 1.1
    import QtQuick.Controls.Styles 1.4
    import QtQuick.Window 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
    
        ListModel {
            id: listModel
            ListElement {slmIndex: 0}
            ListElement {slmIndex: 1}
            ListElement {slmIndex: 2}
            ListElement {slmIndex: 3}
            ListElement {slmIndex: 4}
            ListElement {slmIndex: 5}
        }
    
        ListModel {
            id: model1
            ListElement { name: "1" }
        }
        ListModel {
            id: model2
            ListElement { name: "1" }
            ListElement { name: "2" }
        }
        ListModel {
            id: model3
            ListElement { name: "1" }
            ListElement { name: "2" }
            ListElement { name: "3" }
        }
        ListModel {
            id: model4
            ListElement { name: "1" }
            ListElement { name: "2" }
            ListElement { name: "3" }
            ListElement { name: "4" }
        }
        ListModel {
            id: model5
            ListElement { name: "1" }
            ListElement { name: "2" }
            ListElement { name: "3" }
            ListElement { name: "4" }
            ListElement { name: "5" }
        }
        ListModel {
            id: model6
            ListElement { name: "1" }
            ListElement { name: "2" }
            ListElement { name: "3" }
            ListElement { name: "4" }
            ListElement { name: "5" }
            ListElement { name: "6" }
        }
        property var secondLayerModels: [
            model1, model2, model3, model4, model5, model6
        ]
    
        ListView {
            anchors.centerIn: parent
            width: 200
            height: 200
            clip: true
            model: listModel
            orientation: ListView.Vertical
            delegate: ListView {
                width: 200
                height: 50
                model: secondLayerModels[slmIndex]
                orientation: ListView.Horizontal
                delegate: Rectangle {
                    width: 50
                    height: 50
                    border.color: "black"
                    Text {
                        anchors.fill: parent
                        verticalAlignment: Text.AlignVCenter
                        horizontalAlignment: Text.AlignHCenter
                        text: name
                    }
                }
            }
        }
    }
    

    我不确定这个答案是否完全涵盖了这个问题。它不包括如何创建将公开其他模型的 C++ 模型。

    【讨论】:

    • 可以通过attributes 嵌套ListModels,参见here 和相关链接。也就是说,在我看来,嵌套模型是不必要的复杂性增加。我会注册 c++ 模型,然后在带有Flickable + Repeater 的自定义视图中使用它们。在更动态的环境中,例如如果 c++ 模型的数量可以发生巨大变化,那么最好有一个独特的类来公开模型的数量并授予对它们的访问权限。只是我的两分钱。
    • @Filip 嗨,问题是我不知道我将拥有多少个模型——这取决于 C++ 中的一些数据。我知道可以将 ListElement 添加到 ListModel 但我找不到合适的方法来创建 N ListModels 然后将元素添加到每个模型。在示例中,您使用属性 var secondLayerModels 硬编码了 6 个模型。 ## BaCaRoZzo:我已经尝试在中继器中使用 Listview,它也适用于模型数组并根据索引获取每个模型。你知道我问菲利普的事吗?这似乎是一个简单的问题,但我无法找到解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多