Есть ли способ для XmlListModel не отображать элементы, для которых XmlRole пуст? - PullRequest
1 голос
/ 24 января 2020

Я хотел бы использовать следующий XmlListModel

XmlListModel {
    xml: "<feed>"
         +"  <entry><title>Bob</title></entry>"
         +"  <entry><title></title></entry>"
         +"</feed>"

    query: "/feed/entry"

    XmlRole { name: "title"; query: "title/string()" }
}

и не отображать записи с пустым заголовком.

Конечно, XML исходит из удаленного источника, который я не владею.

Я не нашел информации о такой возможности.

Есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Свойство query XmlListModel использует XPath, здесь вы можете выполнить некоторую фильтрацию.

Наличие query: "/feed/entry[title != '']" сделает то, что вы хотите.

2 голосов
/ 24 января 2020

XmlListModel имеет задачу получить элементы только из XML, поэтому фильтрация должна быть другим процессом. Для этого случая вы можете использовать QSortFilterProxyModel (C ++) или DelegateModel (QML), в этом случае я покажу второй метод:

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.XmlListModel 2.14
import QtQml.Models 2.14

ApplicationWindow {
    width: 400
    height: 300
    visible: true
    ListView {
        id: listView
        anchors.fill: parent
        model: delegateModel
    }
    DelegateModel {
        id: delegateModel
        model: xmlmodel
        delegate: Text {
            id: name
            text: qsTr("title: ") + title
        }
        items.onChanged: update()
        groups: DelegateModelGroup {
            id: visibleItems
            name: "visible"
            includeByDefault: false
        }
        filterOnGroup: "visible"
        function update() {
            if (items.count > 0)
                items.setGroups(0, items.count, "items");
            var visible = [];
            for (var i = 0; i < items.count; ++i) {
                var item = items.get(i);
                // filter items
                if (item.model.title !== "") {
                    visible.push(item);
                }
            }
            for (i = 0; i < visible.length; ++i) {
                item = visible[i];
                item.inVisible = true;
                if (item.visibleIndex !== i)
                    visibleItems.move(item.visibleIndex, i, 1);
            }
        }
    }
    XmlListModel {
        id: xmlmodel
        xml: "<feed>"
             +"  <entry><title>Bob</title></entry>"
             +"  <entry><title></title></entry>"
             +"</feed>"

        query: "/feed/entry"
        XmlRole { name: "title"; query: "title/string()" }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...