【问题标题】:ListModel containing data property of delegateListModel 包含委托的数据属性
【发布时间】: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/…

标签: qt qml


【解决方案1】:

我刚刚偶然发现了QtQml.Models 中定义的ObjectModel(通过今天发布的另一个StackOverflow 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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
相关资源
最近更新 更多