2017-07-14 95 views
0

我試圖提取與selectFolder: true選擇的文件夾中的所有圖像文件的路徑。 我能找到的所有示例都使用FolderListModel,它可以靜態分配文件夾。 我試圖定義對話框內的臨時FolderListModel並更改其folder財產一旦我有從對話框的結果:獲取通過FileDialog選擇的文件夾中的文件名列表

FileDialog { 
    id: select_folder_dialog 

    FolderListModel { 
     id: mdl 
     nameFilters: ["*.jpg", "*jpeg", "*.png"] 
    } 

    onAccepted: { 
     visible = false 
     var files = [] 
     console.log(folder) 
     mdl.folder(folder) 
     text1.text = qsTr("%1 images selected.".arg(mdl.count)) 
    } 
    title: "Select a folder containing image file(s) to classify" 
    selectFolder: true 
} 

然而,這讓我的錯誤:

Cannot assign object to property

我很困惑。這對我來說似乎是一個相當標準的用例(例如,在列表中顯示用戶定義的文件夾中的所有文件),但我找不到任何示例。

這樣做的正確方法是什麼?

回答

2

這裏的問題與兒童Item在QML中的處理方式有關。一般而言,每個Item都有一個default property

A default property is the property to which a value is assigned if an object is declared within another object's definition without declaring it as a value for a particular property.

ItemItem派生類型這樣的屬性是data的情況下,這

allows you to freely mix visual children and resources in an item. If you assign a visual item to the data list it becomes a child and if you assign any other object type, it is added as a resource.

這是感謝對data,你可以如混合並匹配Timer,Rectangle以及Item衍生類型中的其他可見和不可見類型。可能的default財產不允許這種自由度。因此,其解決方案FileDialog中取出FolderListModel,以避免該錯誤。

還應該注意的是,簡單地分配folder屬性並不授權用戶查詢模型。 I/O操作可能需要時間並且模型更新異步發生。因此,最好等待適當的事件,例如onFolderChanged,以確保模型準備好被查詢。由此產生的工作,示例可能如下所示:

import QtQuick 2.8 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 
import Qt.labs.folderlistmodel 2.1 

Window { 
    title: qsTr("Test dialog") 
    visible: true 
    width: 640 
    height: 480 

    FolderListModel { 
     id: fileModel 
     nameFilters: ["*.*"] 

     onFolderChanged: { console.info(fileModel.get(0, "fileName")) } 
    } 

    FileDialog { 
     id: dialog 
     title: "Select a folder containing image file(s) to classify" 
     selectFolder: true 

     onAccepted: { 
      dialog.close() 
      fileModel.folder = folder 
     } 
    } 

    Component.onCompleted: dialog.open() 
} 
相關問題