ListModel 包含委托的数据属性

Posted

技术标签:

【中文标题】ListModel 包含委托的数据属性【英文标题】:ListModel containing data property of delegate 【发布时间】:2019-07-24 08:13:08 【问题描述】:

是否可以在 qml 中创建一个 GridView,它的子项在模型中定义,所以我可以为我的 GridView 项目创建一个完整的动态子视图,例如我想在模型中定义 10 个不同的矩形作为我的数据委托。 为此,我想创建一个 GridView 并从模型中设置委托的 data 属性

GridView 
    model: ListModel
        ListElement
            childs:Item 
                // data is a list<Object> , so item here is wrong
                //this part is wrong i am looking for correct way of doing this
                //error : cannot contain nested elements 
                Button

                
                Button

                
            
        
    

    delegate: Rectangle
        data:childs
    

这段代码解释了我的问题的逻辑。但它不正确。 我的模型项目将在矩形内,但它的孩子是完全动态的,它可能是 100 个我不知道的项目。 或者问这个问题的另一种方法是“我可以在 ListModel 中有一个组件吗?”更新 所以如果我想使用它,它最终会像这样“让我们说文件名是 MyWidget”:

MyWidget
    model:ListModel
       //and here we go how can i set data of GridView's delegate
    


【问题讨论】:

我猜你不只想要 Rectangle,因为那时你可以只将属性封装在 ListModel 中而不是 Rectangle 本身? @Amfasis 将其视为卡片的 GridView,卡片的内容是动态的 好的,我明白了。也许您想尝试这种方法:forum.qt.io/topic/80826/dynamic-delegate-in-repeater/4 @Amfasis 如果我使用加载器,那么我应该为每个孩子定义组件,这不是动态的,正如我从这个解决方案中理解的那样 那么,您的模型来自哪里,由谁填充?如果像在您的示例中一样,它来自 QML,那么我个人认为没有区别,但如果它来自 C++,则情况不同,但在这种情况下,您可以自己创建组件(请参阅forum.qt.io/topic/42087/…) 【参考方案1】:

我刚刚偶然发现了QtQml.Models 中定义的ObjectModel(通过今天发布的另一个*** question)。我进行了一些尝试并提出了这个解决方案,这并不理想,但我认为可以为您提供相当多的东西。

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQml.Models 2.3

Window 
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ObjectModel 
        id: obj_model
        Rectangle 
            width: 10
            height: 10
            color: "#00ffff"
        
        Rectangle 
            width: 10
            height: 10
            color: "#ff00ff"
        
    

    GridView 
        anchors.fill: parent
        model: grid2.count

        delegate: Rectangle 
            x: 5
            y: 5
            height: 90
            width: 90
            color: "red"
        
    

    GridView 
        id: grid2
        anchors.fill: parent
        model: obj_model
    

之所以有效,是因为GridView 具有相同的cellHeightcellWidth(隐含地,您可以将它们绑定在一起)并且位置相同。

这并不完美,因为 ObjectModel 在 grid2 中停止使用委托(这也是前面提到的 SO 问题的答案)

【讨论】:

这就是我要找的ObjectModelty

以上是关于ListModel 包含委托的数据属性的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:无法在嵌套列表视图中读取 null 的属性“newdaycalendar”,其中 listmodel 动态创建了 qml

根据 listElement 键切换 listView 的委托

如何从另一个 QML 访问和控制 ListModel 的内容

QML 视图中的 Foreach 委托

列表模型中的元素类型

带有委托复选框的 QML TableView 无法显示