Как было сказано в комментарии, вы действительно можете использовать модель QSortFilterProxy, но здесь есть другое решение. Вы можете реализовать чисто QML FilterProxyModel, используя DelegateModel
и DelegateModelGroup
import QtQuick 2.10
import QtQml.Models 2.3
DelegateModel {
property var filterAccepts: function(item) {
return true
}
onFilterAcceptsChanged: refilter()
function refilter() {
if(hidden.count>0)
hidden.setGroups(0, hidden.count, "default")
if(items.count>0)
items.setGroups(0, items.count, "default")
}
function filter() {
while (unsortedItems.count > 0) {
var item = unsortedItems.get(0)
if(filterAccepts(item.model))
item.groups = "items"
else
item.groups = "hidden"
}
}
items.includeByDefault: false
groups: [
DelegateModelGroup {
id: default
name: "default"
includeByDefault: true
onChanged: filter()
},
DelegateModelGroup {
id: hidden
name: "hidden"
}
]
}
Объяснение : Каждый раз, когда элемент добавляется в модель, он добавляется в группу «по умолчанию», которая вызывает обработчик onChanged
, который будет вызывать filter()
.
Filter () будет искать элементы в группе по умолчанию и перемещать их либо в группу items
(которая сделает их видимыми), либо в группу hidden
, в зависимости от результата функции filterAccepts.
Когда изменяется filterAccept, SortProxyModel будет перемещать каждый элемент в группу по умолчанию для запуска глобальной повторной фильтрации.
Затем вы можете использовать свою прокси-модель следующим образом:
FilterProxyModel
{
id: filterProxyModel
model: <YourBaseModel>
delegate: <YourDelegate>
filterAccepts: function(item) {
// Eg: Only "small" items will be displayed
return item.size == "small"
}
}
GridView
{
anchors.fill: parent
model: filterProxyModel
cellHeight: 100
cellWidth: 100
}