我想實現搜索功能,我的音樂播放器完全用Qml 寫成。在我的情況下,我啓動了一個qml Filedialog從文件系統獲取文件夾,然後我使用folderListModel通過ListView列出它們。 我想通過列表搜索任何線索我怎麼能做到這一點?如何在Qt中實現搜索功能Quick folderListmodel ??
請不要建議使用C++。也不建議我在foldelistmodel中使用nameFilters :["*."]
因爲它不會工作它只根據文件擴展名而不是文件名進行過濾
我想實現搜索功能,我的音樂播放器完全用Qml 寫成。在我的情況下,我啓動了一個qml Filedialog從文件系統獲取文件夾,然後我使用folderListModel通過ListView列出它們。 我想通過列表搜索任何線索我怎麼能做到這一點?如何在Qt中實現搜索功能Quick folderListmodel ??
請不要建議使用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}
}
}
與DelegateModelGroup進行排序和篩選委託項目。
假設你有一個函數使用文件名過濾文件,
function willBeShownOnView(filename){ /* ... */ }
你可以通過更多的角色(fileSize
,fileIsDir
,...)或過濾字符串由用戶如果輸入擴展這個功能你需要在這個函數中實現過濾邏輯。
接下來,創建一個DelegateModel
與filterGroup
:
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
//...
}
謝謝你:) – bulldog68
感謝的人它就像魅力:)妳對我來說我已經從多個然後一個星期我都試過了挖這個生命的救星,你來了,如同神只有56行代碼與一個工作示例感謝很多:) – bulldog68