Динамическое скрытие разделов QML ListView при фильтрации элементов - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть ListView (родительский), который использует ListView (дочерние элементы) в качестве делегата, поэтому каждый родительский элемент является listView некоторых элементов.

Чтобы использовать типичный пример, родительский список может быть списком размеров (L, M и S), а каждый дочерний список будет списком животных данного размера (L животных, M животных, S животные).

В обоих списках используется пользовательская модель, которая наследуется от QAbstractListModel. Но модель дочерних списков, используемая в представлении, является пользовательской моделью, которая наследуется от QSortFilterProxyModel, чтобы иметь функции фильтрации.

Элементы родительского списка работают как «размеры» для детей, поэтому они используются как разделы. Представление отображается как:

БОЛЬШОЙ: - large_animal_1 - large_animal_2

MEDIUM: - medium_animal_1 - ...

Что мне нужно, так это в том случае, если данный раздел не имеет элементы после фильтрации, раздел НЕ должен отображаться. В текущем представлении, когда после фильтрации нет «животных», появляется заголовок раздела:

LARGE:

MEDIUM: - medium_animal_1 - ...

Код QML :

ListView {
        id: headers
        anchors.fill: parent
        clip: true
        boundsBehavior: Flickable.StopAtBounds

        model: _headersModel

        delegate: 
            Item {
                width: parent.width
                height: some_value

                ListView {
                    id: items_of_same_category
                    anchors.fill: parent
                    spacing: 5
                    clip: true
                    interactive: false

                    model: proxy_model

                    delegate: component_delegate
                }
            }

        section.property: "category_value"
                    section.criteria: ViewSection.FullString
                    section.delegate: header_delegate
                    section.labelPositioning: ViewSection.InlineLabels | ViewSection.CurrentLabelAtStart            
    }

1 Ответ

0 голосов
/ 11 апреля 2020

Почему бы вам не соединить две модели в cpp с помощью сигналов, и когда у вас нет элементов для второго делегата, отфильтруйте из первой модели элемент, который отвечает за делегата во второй модели. То есть, если нет Large_animal_ * s, отфильтруйте значение Large из вашей первой модели.

Другими словами, попробуйте решить вашу проблему со стороны cpp и позвольте QML показать модель такой, какая она есть. должен делать.

...