2017-07-14 10 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ですTimerRectangle、その他由来のタイプの中には、他の見えるものと見えないものが混在することがあります。おそらくdefaultのプロパティーはFileDialogであり、そのような自由度はありません。したがって、それを解決するには、FolderListModelFileDialogを避けてください。

また、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() 
} 
関連する問題