使用DelegateModel:
使用DelegateModelGroup 对委托项目进行排序和过滤。
假设你有一个使用文件名过滤文件的函数,
function willBeShownOnView(filename){ /* ... */ }
如果需要,您可以通过传递更多角色(fileSize、fileIsDir、...)或用户输入的过滤字符串来扩展此函数,并在此函数中实现过滤逻辑。
接下来,使用filterGroup 创建一个DelegateModel:
DelegateModel {
id: delegateModel
model: FolderListModel{id: folderModel}
groups: [
DelegateModelGroup {
name: "filterGroup"; includeByDefault: true
}
]
filterOnGroup: "filterGroup"
delegate: MyFileDisplayComponent{/* ... */}
function applyFilter(){ /* see below */}
}
作为includeByDefault: true,folderModel 中的所有项目都包含在filterGroup 中。当我们applyFilter时,应该从这个组中删除一些项目。例如,
function applyFilter(){
var numberOfFiles = folderModel.count;
for (var i = 0; i < numberOfFiles; i++){
var fileName = folderModel.get(i, "fileName");
if (willBeShownOnView(fileName)){items.addGroups(i, 1, "filterGroup");}
else {items.removeGroups(i, 1, "filterGroup");}
}
}
调用applyFilter 后,只有通过willBeShownOnView 的文件才会添加到filterGroup。属性filterOnGroup: "filterGroup" 表示委托模型仅包含filterGroup 中的项目。因此,我们可以使用一个简单的 ListView 来显示结果:
ListView {
model: delegateModel
//...
}