将数据添加到 QML TreeView

Posted

技术标签:

【中文标题】将数据添加到 QML TreeView【英文标题】:Adding data to QML TreeView 【发布时间】:2019-09-11 14:20:30 【问题描述】:

我正在开发一个应用程序。我需要向 TreeView 添加数据,但 TreeView 的嵌套模型存在一些问题。

我创建了一个列表模型

ListModel 
    id: fruitModel
    ListElement 
       name: "Apple"
       price: 2.45
    

我可以通过以下方式展示这个项目

TreeView 
    id: mytreeView
    anchors.fill: parent
    model: fruitModel
    TableViewColumn 
        title: "Name"
        role: "name"
        width: 200
    
    TableViewColumn 
        title: "Price"
        role: "price"
        width: 200
    

但是,我需要显示嵌套项目,例如

ListModel 
   ListElement 
            categoryName: "Fruits"
            collapsed: true
            subItems: [
                ListElement  itemName: "Orange" , itemPrice: 2.40,
                ListElement  itemName: "Apple" ,  itemPrice: 2.40,
                ListElement  itemName: "Pear" ,   itemPrice: 2.40,
                ListElement  itemName: "Lemon" ,  itemPrice: 2.40
            ]
    

我在 ListView 中列出了这些项目,但我需要在 TreeView 中列出这些项目。那么,如何使用 QML 在 TreeView 中列出这个嵌套的 ListModel?

【问题讨论】:

【参考方案1】:

首先,您需要更正角色以匹配您的新嵌套模型/ListElement 的范围/角色。并正确构建您的模型(您对 ListElement 项目使用“,”.. 使用“;”)如下更正。

其次,使用listmodel函数object get(index)向下迭代并锁定嵌套模型。

这行得通!:

ListModel 
    id:fruitModel
    ListElement 
        categoryName: "Fruits"
        collapsed: true
        subItems: [
            ListElement  itemName: "Orange" ; itemPrice: 2.40,
            ListElement  itemName: "Apple" ;  itemPrice: 2.40,
            ListElement  itemName: "Pear" ;   itemPrice: 2.40,
            ListElement  itemName: "Orange" ;  itemPrice: 2.40
        ]
    
    ListElement 
        categoryName: "Vegetable"
        collapsed: true
        subItems: [
            ListElement  itemName: "Broccoli" ; itemPrice: 4.20,
            ListElement  itemName: "Garlic" ;  itemPrice: 7.40,
            ListElement  itemName: "beens" ;   itemPrice: 6.40,
            ListElement  itemName: "Eggplant" ;  itemPrice: 1.40
        ]
    

TreeView 
    id: mytreeView
    anchors.fill: parent
    model:fruitModel.get(0).subItems  // get nested model this way , or by javascript! 
    TableViewColumn 
        title: "Name"
        role: "itemName"   // here
        width: 200
    
    TableViewColumn 
        title: "Price"
        role: "itemPrice"   // here 
        width: 200
    
    //Component.onCompleted: model= fruitModel.get(0).subItems

更新日期

要显示多个嵌套元素,您可以使用section 属性和ListView,并使用TreeView 显示嵌套模型:

ListView 
    anchors.fill: parent
    model: fruitModel
    delegate: nameDelegate
    focus: true
    highlight: Rectangle 
        color: "lightblue"
        width: parent.width
    
    section 
        property: "categoryName"
        criteria: ViewSection.FullString
        delegate: Rectangle 
            color: "#b0dfb0"
            width: parent.width
            height: childrenRect.height + 4
            Text  anchors.left: parent.left
                font.pixelSize: 16
                font.bold: true
                text: section
            
        
    

Component 
    id: nameDelegate
    TreeView 
        id: mytreeView
        width: parent.width
        model:fruitModel.get(index).subItems  // get nested model
        TableViewColumn 
            title: "Name"
            role: "itemName"   // here
            width: 200
        
        TableViewColumn 
            title: "Price"
            role: "itemPrice"   // here
            width: 200
        
    

【讨论】:

请不要在ListModel 上依赖get(int),除非您非常确定,您永远不想在演变为使用C++ 定义模型的应用程序中使用那段代码.标准 C++ 模型不提供该功能。在 C++ 模型上提供该函数并非微不足道(许多人返回属性映射,这对于只读来说是可以的,但如果您想使用该对象来修改模型则不起作用)。也就是说,我对树视图一无所知,没有运行 Qt 环境,所以我无法提供解决方案。请注意这个潜在的问题! @derM,感谢您的建议。我有一个功能性应用程序,其中模型完全填充在 QML 中。所有用户条目都存储在具有嵌套 attribues 的单个元素中 .. 显示这些属性(一次一个)但然后不去更进一步......每个元素都被传递给父模型以进行保留和 JSON 字符串化。就编码人员知道自己在做什么而言,这很方便。 感谢您的解决方案,但我想在我的子项目树中显示类别名称。如何使用类别名称显示我的子项目?此外,我的列表模型中将有多个项目。如何将多个 ListModel 项目添加到我的树中?你能帮我解决这个问题吗? @HilalKöktürk,这取决于您计划显示的外观...您想将整个模型显示为可扩展的树视图吗?或者您唯一关心的是按顺序列出内容 我想将我的整个模型显示为可展开的树视图

以上是关于将数据添加到 QML TreeView的主要内容,如果未能解决你的问题,请参考以下文章

如何将 qml ScatterSeries 添加到现有的 qml 定义的 ChartView?

如何将 QML 映射添加到 QGraphicsscene?

如何将 Switch Qml 添加到 qt 小部件?

BB Cascades,将数据从 C 传递到 Page1.qml 和 Page2.qml

创建后如何将项目添加到 QML 网格?

将 QML(QQuickView) 添加到现有 UI