Использование Nested JSON в качестве section.property в listView QML - PullRequest
1 голос
/ 02 апреля 2020

Я создаю listView, где мой делегат и его информация поступают из JSON - Моя проблема в том, что я пытаюсь установить section.property из вложенной области в пределах JSON. Вложенные данные будут динамическими c, поэтому мне нужно работать так, чтобы они адаптировались к каждому пользователю приложения.

Документация, с которой я работаю: JsonListModel & 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 секции из гнезда roles. Assistant, Reception, Stylist, Technical

Мой вопрос: Я хотел бы использовать roles в качестве моего ListView {section.property}, и видимость пользователей зависит от их логического значения в этой роли - поэтому от приведенный выше пример; Эдвард будет виден как в приеме, так и в стилисте, тогда как Клэр будет видна как в помощнике, так и в стилисте!

Как определить вложенное 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

...