获取通过FileDialog选择的文件夹中的文件名列表

时间:2017-07-14 11:09:34

标签: qt qml qtquick2

我尝试提取使用FileDialog selectFolder: true选择的文件夹中所有图像文件的路径。 我能找到的所有示例都使用FolderListModel来获取静态分配的文件夹。 我尝试在对话框中定义一个临时FolderListModel,并在得到对话框的结果后更改其folder属性:

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
}

但这会让我错误:

  

无法将对象分配给属性

我很困惑。在我看来,这是一个相当标准的用例(例如,在列表中显示用户定义文件夹中的所有文件),但我找不到任何示例。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

此处的问题与在QML中处理子Item的方式有关。一般来说,每个Item都有一个default property

  

默认属性是如果在另一个对象的定义中声明对象而未将其声明为特定属性的值,则为其分配值的属性。

对于ItemItem - 派生类型,此类属性为data

  

允许您自由混合项目中的可视化子项和资源。如果将可视项目分配给数据列表,它将成为子项,如果您指定任何其他对象类型,则将其添加为资源。

感谢data您可以,例如混合并匹配TimerRectangle以及Item派生类型中的其他可见和不可见类型。可能default的{​​{1}}属性不允许这种程度的自由。因此,FileDialog中取出 FolderListModel的解决方案,以避免错误。

还应该注意,简单地分配FileDialog属性并不授权用户查询模型。 I / O操作可能需要时间,并且模型更新是异步发生的。因此,最好等待适当的事件,例如folder,以确保模型已准备好进行查询。生成的工作示例可能如下所示:

onFolderChanged