2017-07-14 3 views
0

J'essaie d'extraire le chemin de tous les fichiers d'image dans un dossier qui est sélectionné avec FileDialog avec selectFolder: true. Tous les exemples que j'ai pu trouver utilisent un FolderListModel qui obtient le dossier assigné statiquement. J'ai essayé de définir une FolderListModel temporaire à l'intérieur de la boîte de dialogue et changer sa propriété folder une fois que j'ai le résultat de la boîte de dialogue:Obtenir la liste des noms de fichiers dans le dossier sélectionné via 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 
} 

Cependant, cela me fait l'erreur:

Cannot assign object to property

Je suis très confus . Cela me semble un cas d'utilisation plutôt standard (par exemple afficher dans une liste tous les fichiers dans un dossier défini par l'utilisateur), mais je ne trouve aucun exemple.

Quelle est la bonne façon de faire cela?

Répondre

2

Le problème ici est lié à la façon dont les enfants Item sont traités en QML. En général, chaque Item a un 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.

Dans le cas de Item et Item types une telle propriété dérivée de data est qui

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.

Il est merci à data que vous pouvez par exemple mélangez et associez Timer, Rectangle ainsi que d'autres types visibles et non visibles dans un type dérivé de Item. Probablement, la propriété default de FileDialog ne permet pas un tel degré de liberté. Par conséquent, la solution à sortirFolderListModel de FileDialog, pour éviter l'erreur.

Il convient également de noter que l'attribution simple de la propriété folder n'autorise pas l'utilisateur à interroger le modèle. Les opérations d'E/S peuvent prendre du temps et les mises à jour du modèle ont lieu de manière asynchrone. Ainsi, il est préférable d'attendre des événements appropriés, par ex. onFolderChanged, pour s'assurer que le modèle est prêt à être interrogé. Un résultant, de travail, exemple pourrait ressembler à ce qui suit:

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() 
}