在listView QML中使用嵌套JSON作为section.property。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在listView QML中使用嵌套JSON作为section.property。相关的知识,希望对你有一定的参考价值。

我正在创建一个 listView 我的代表和它的信息来自JSON--我的问题是,我正试图将我的代表的信息设置为 section.property 从JSON中的一个嵌套区域中获取数据。嵌套的数据将是动态的,所以我需要以一种适应每个应用程序用户的方式工作。

我正在使用的文档是。JsonListModel &amp.SortFilterProxyModel SortFilterProxyModel

我的JSON的例子是

[
"firstname":"Edward",
"subGroup":"Reception",
"admin":1,
"roles":
    "Assistant":0,"Reception":1,"Stylist":1,"Technical":0
    
,

"firstname":"Claire",
"subGroup":"Stylist",
"admin":1,
"roles":
    "Assistant":1,"Reception":0,"Stylist":1,"Technical":0
    
]

我的工作是通过使用 JsonListModel,QT Creator我的代码的最小部分如下。

import Felgo 3.0
import QtQuick 2.0

Page 
id: editAdmins


property var newArr: dataModel.calendarUserItems.users
property var userRoles: ()
property var l

JsonListModel  // list model for json data
    id: jsonModel
    source: dataModel.jsonList // my full JSON
    keyField: "firstname " + " surname" 
    fields: ["firstname", "surname", "subGroup", "admin", "email", "roles"]


SortFilterProxyModel  // SortFilterProxyModel for sorting or filtering lists
    id: sortedModel
   // Note: when using JsonListModel, the sorters or filter might not be applied correctly when directly assigning sourceModel
   // use the Component.onCompleted handler instead to initialize SortFilterProxyModel
    Component.onCompleted: sourceModel = jsonModel
    sorters: [
        RoleSorter 
            id: groupSorter
            roleName: "subGroup"
        ,
    ]


AppListView 
    id:view
    model: sortedModel
    anchors.fill: parent

    section.property: "subGroup" //How I have used it previously before needing to set 'roles' as my property (which shows nothing)
    section.delegate: SimpleSection 

delegate: SimpleRow 
    id: container

    text: model.firstname
    detailText: model.surname
    


从上面的JSON,预期的结果将是,我的listView有4个Sections,从内部的 roles 巢。Assistant, Reception, Stylist, Technical

我的问题是。我想使用 roles 作为我 ListView section.property而用户的可见性取决于他们在该角色中的布尔值--所以从上面的例子来看,Edward在接待和造型师中都是可见的,而Claire在助理和造型师中都是可见的。

我如何定义嵌套的JSON作为我的列表中的部分属性?

通过增加一个额外的 proxyRole 在我 SortFilterProxyModel 如图所示。

proxyRoles: ExpressionRole 
            name: "role"
            expression: JSON.stringify(model.roles)
       

并改变我 section.property: 到 "角色",我能够为那些具有匹配角色的人创建部分,更接近,但仍然没有达到预期的目的(见附件截图)。

我进一步尝试了用许多不同的方法循环浏览数据。

        expression: 
            for(var x in model.roles)
                if(model.roles[x] === 1)
                    x
                
            
        

要么返回最后的索引(如上文所述),要么再次将项目推送到一个新的数组中,但结果仍然是全部返回。

ListView with ExpressionRole

答案

ListViews 创建每个代表从他们的模型数据中派生出来,这意味着代表不能重复,因为实际上这就是我试图做的,取决于用户角色中的布尔运算。

我纠正了这一点,当数组被创建时,任何用户在其角色中具有多个布尔值,都会为每个角色获得一个额外的数组对象,并引导我的 section.property 到每个单独的角色名称。

从下面的代码中,Edward将创建2个数组对象,然后作为一个 "复制 "委托。

[
"firstname":"Edward",
"subGroup":"Reception",
"admin":1,
"roles":
    "Assistant":0,"Reception":1,"Stylist":1,"Technical":0
    
,

"firstname":"Claire",
"subGroup":"Stylist",
"admin":1,
"roles":
    "Assistant":1,"Reception":0,"Stylist":1,"Technical":0
    
]

以上是关于在listView QML中使用嵌套JSON作为section.property。的主要内容,如果未能解决你的问题,请参考以下文章

如何在 qml 中没有 listmodel 的情况下存储嵌套 ListView 的数据并在之后检索

QML中具有嵌套滚动区域的二维表

在 ListView 中显示嵌套的 json 数组

在 qml 如何保存作为列表视图元素的标签文本

Qt中使用QML和Listview的问题

如何在QML中设计一个expandable ListView