2017-07-14 9 views
0

Ich versuche, den Pfad aller Bilddateien in einem Ordner, der mit einem FileDialog mit selectFolder: true ausgewählt ist, zu extrahieren. Alle Beispiele, die ich finden konnte, verwenden eine FolderListModel, die den Ordner statisch zugewiesen bekommt. Ich habe versucht, eine temporäre FolderListModel innerhalb des Dialog definieren und seine folder Eigenschaft ändern, sobald ich das Ergebnis aus dem Dialog haben:Liste der Dateinamen in Ordner über 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 
} 

Dies wird mir aber den Fehler:

Cannot assign object to property

Ich bin sehr verwirrt . Dies scheint mir ein eher üblicher Anwendungsfall zu sein (z. B. das Anzeigen aller Dateien in einem benutzerdefinierten Ordner in einer Liste), aber ich kann kein Beispiel finden.

Was ist der richtige Weg, dies zu tun?

Antwort

2

Das Problem hier bezieht sich auf die Art und Weise, in der Kinder Item s in QML behandelt werden. Im Allgemeinen hat jede Item eine 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.

Im Falle von Item und Item abgeleiteten Typen eine solche Eigenschaft data ist die

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.

Es Danke an data hinaus können Sie zum Beispiel mix and match Timer, Rectangle sowie andere sichtbare und nicht sichtbare Typen innerhalb eines Item-abgeleiteten Typs. Wahrscheinlich erlaubt die default Eigenschaft von FileDialog solch einen Freiheitsgrad nicht. Daher ist die Lösung FolderListModel von FileDialog herauszunehmen, um den Fehler zu vermeiden.

Es sollte auch beachtet werden, dass das einfache Zuweisen der -Eigenschaft den Benutzer nicht berechtigt, das Modell abzufragen. E/A-Vorgänge können Zeit beanspruchen und Modellaktualisierungen werden asynchron ausgeführt. Daher ist es besser, auf geeignete Ereignisse zu warten, z. onFolderChanged, um sicherzustellen, dass das Modell abgefragt werden kann. Ein resultierendes, funktionierendes, Beispiel könnte wie folgt aussehen:

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