2015-04-16 137 views
1

我想實現搜索功能,我的音樂播放器完全用Qml 寫成。在我的情況下,我啓動了一個qml Filedialog從文件系統獲取文件夾,然後我使用folderListModel通過ListView列出它們。 我想通過列表搜索任何線索我怎麼能做到這一點?如何在Qt中實現搜索功能Quick folderListmodel ??

請不要建議使用C++。也不建議我在foldelistmodel中使用nameFilters :["*."]因爲它不會工作它只根據文件擴展名而不是文件名進行過濾

回答

1

實際上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} 
    } 

} 
+0

感謝的人它就像魅力:)妳對我來說我已經從多個然後一個星期我都試過了挖這個生命的救星,你來了,如同神只有56行代碼與一個工作示例感謝很多:) – bulldog68

0

使用DelegateModel

DelegateModelGroup進行排序和篩選委託項目。

假設你有一個函數使用文件名過濾文件,

function willBeShownOnView(filename){ /* ... */ } 

你可以通過更多的角色(fileSizefileIsDir,...)或過濾字符串由用戶如果輸入擴展這個功能你需要在這個函數中實現過濾邏輯。

接下來,創建一個DelegateModelfilterGroup

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 
    //... 
} 
+0

謝謝你:) – bulldog68

相關問題