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