如何在Qt Quick folderListmodel中实现搜索功能??

如何在Qt Quick folderListmodel中实现搜索功能??,qt,qml,qtquick2,Qt,Qml,Qtquick2,我想实现搜索功能,我的音乐播放器完全写在Qml . 在我的例子中,我启动了一个qml文件对话框来从文件系统获取文件夹,然后使用folderListModel通过ListView列出它们。 我想在列表中搜索任何线索我如何才能做到这一点 请不要建议使用C++。而且也不建议我在foldelistmodel中使用nameFilters:[“*。”],因为它不起作用。它只根据文件扩展名进行过滤,而不是文件名。实际上nameFilters允许按文件名进行过滤。使用一种黑客技术,甚至可以使其不区分大小写 下面

我想实现搜索功能,我的音乐播放器完全写在Qml . 在我的例子中,我启动了一个qml文件对话框来从文件系统获取文件夹,然后使用folderListModel通过ListView列出它们。 我想在列表中搜索任何线索我如何才能做到这一点


请不要建议使用C++。而且也不建议我在foldelistmodel中使用
nameFilters:[“*。”]
,因为它不起作用。它只根据文件扩展名进行过滤,而不是文件名。实际上
nameFilters
允许按文件名进行过滤。使用一种黑客技术,甚至可以使其不区分大小写

下面是一个丑陋但有效的例子:

import QtQuick 2.3
import QtQuick.Controls 1.2
import Qt.labs.folderlistmodel 2.1

Item {
    width: 300
    height: 300

    FolderListModel
    {
        id: folderListModel
    }

    function updateFilter()
    {
        var text = filterField.text
        var filter = "*"
        for(var i = 0; i<text.length; i++)
            if(!caseSensitiveCheckbox.checked)
                filter+= "[%1%2]".arg(text[i].toUpperCase()).arg(text[i].toLowerCase())
            else
                filter+= text[i]
        filter+="*"
        print(filter)
        folderListModel.nameFilters = [filter]
    }

    Row
    {
        spacing: 5
        Text {text:"Filter"}
        TextField
        {
            id: filterField
            onTextChanged: updateFilter()
        }

        Text {text:"Case Sensitive"}
        CheckBox
        {
            id: caseSensitiveCheckbox
            checked: false
            onCheckedChanged:updateFilter()
        }
    }

    ListView
    {
        anchors.fill: parent
        anchors.topMargin: 30
        model:folderListModel
        delegate: Text{text: model.fileName}
    }

}
导入QtQuick 2.3
导入QtQuick.Controls 1.2
导入Qt.labs.folderlistmodel 2.1
项目{
宽度:300
身高:300
折页列表模型
{
id:folderListModel
}
函数updateFilter()
{
var text=filterField.text
var filter=“*”
对于(var i=0;i使用:

使用对代理项进行排序和筛选

假设您有一个使用文件名过滤文件的函数

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");}
    }
}

谢谢,伙计,它的工作原理很有魅力:)你是我的救命恩人我从一周多的时间里一直在挖掘这个,我尝试了一切,你像上帝一样来了,只带了56行代码和一个工作示例,非常感谢:)
ListView { 
    model: delegateModel
    //...
}