21.Quick QML-FileDialog、FolderDialog对话框

  • 2021 年 5 月 11 日
  • 筆記

1.FileDialog介绍

Qt Quick中的FileDialog文件对话框支持的平台有:

 

笔者使用的是Qt 5.8以上的版本,模块是import Qt.labs.platform 1.1.

 

它的属性如下所示:

  • acceptLabel : string,标签,设置对话框中的接收按钮的文本内容,默认标签通常为打开或保存
  • rejectLabel : string,标签,设置对话框中的拒绝按钮的文本内容
  • currentFile : url,此属性保存对话框中当前选定的文件路径,假如我们是保存文件,并且想给要保存的文件命名,比如123.txt,则赋值”file:///123.txt”
  • currentFiles : list<url>,此属性保存对话框中当前多选下选定的文件
  • defaultSuffix : string,默认后缀,如果选定的文件后缀名没有,那么将defaultSuffix添加到指定到选定的文件名末尾
  • file : url,此属性保存用户最终选中的文件,和currentFile不同,只有当用户点击”确定”键后,才会赋值.
  • files : list<url>,此属性保存用户最终选中的多个文件.和currentFiles不同,只有当用户点击”确定”键后,才会赋值.
  • fileMode : enumeration,对话框属性,取值如下所示:
    • FileDialog.OpenFile: 打开文件(默认)
    • FileDialog.OpenFiles: 打开多个文件
    • FileDialog.SaveFile: 保存文件
  • folder : url,此属性保存文件对话框默认打开时的文件夹路径.如果要使用文件夹对话框,请改用FolderDialog元素
  • nameFilters : list<string>: 文件名筛选器.比如:nameFilters: [“Text files (*.txt)”, “HTML files (*.html *.htm)”]
  • options : flags,对话框选项,默认都是禁止的,取值如下所示:
    • FileDialog.DontResolveSymlinks : 不要在文件夹对话框中解决符号链接
    • FileDialog.DontConfirmOverwrite : 在保存文件状态下,如果文件已存在,则不提示用户,直接覆盖,默认是要提示的.
    • FileDialog.ReadOnly : 设置对话框不允许创建目录。
    • FileDialog.HideNameFilterDetails : 是否隐藏文件名筛选器详细信息
  • selectedNameFilter.index : int,保存用户选择的哪个筛选器索引号
  • selectedNameFilter.name : string,保存用户选择的哪个筛选器名称
  • selectedNameFilter.extensions : list<string> ,保存用户选择的哪个筛选器扩展列表,比如”HTML files (*.html *.htm)”,那么extensions = [“html”,”htm”]
  • title : string, 对话框标题
  • result : int,对话框结果,取值有:
  • Dialog.Accepted : 用户选择了接收按钮
  • Dialog.Rejected : 用户选择了拒绝按钮

Signals:

  • void accepted() : 当用户选择了接收按钮,则发出该信号,假如调用了close()则不会发出
  • void rejected() : 当用户选择了拒绝按钮,则发出该信号,假如调用了close()则不会发出

Methods:

  • void accept() : 关闭对话框,并发射accepted()信号
  • void close() : 关闭对话框,不会发射信号
  • void done(result) : 关闭对话框,并设置result属性值.
  • void open() : 打开对话
  • void reject() : 关闭对话框,并发射rejected()信号

示例如下所示:

Window {
    visible: true;
    width: 560
    height: 440

    FileDialog {
        id: fileDialog
        title: "打开图片或者txt文件"
        nameFilters: ["Text files (*.txt)", "HTML files (*.png *.jpg)"]
        acceptLabel: "确定"
        rejectLabel: "取消"
        fileMode: FileDialog.OpenFile
        onAccepted: {
            console.log("选中的文件有:")
            for (var i in files) {
                console.log(files[i])
            }
        }
    }

    Button {
        text: "打开单个文件"
        onPressed: fileDialog.open();
    }
} 

 

2.FolderDialog
FolderDialog的属性非常少,毕竟只是文件夹对话框.
它的options属性如果设置为FolderDialog.ShowDirsOnly,那么将会只显示文件夹.
当我们对话框在某个文件夹下面时,点击确定,则会将当前文件夹路径保存在currentFolder属性中.

接下来我们便来个综合示例.

 

3.FileDialog和FolderDialog综合示例

界面效果图如下所示:

当我们打开多个文件、保存文件、选择文件夹时,则将目录路径以及选中的文件路径都打印在TextArea中,下次再次点击对话框时,则以之前打开的目录路径为默认路径.

该示例使用了两个自定义控件:

  • DynamicGroupBox (控件代码路径://www.cnblogs.com/lifexy/p/14751099.html)
  • DynamicBtn   (控件代码路径://www.cnblogs.com/lifexy/p/14671855.html)

整个代码如下所示:

import QtQuick 2.14
import QtQuick.Window 2.0
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.14
import Qt.labs.platform 1.1
Window {
    visible: true;
    width: 560
    height: 440

    property string defaltFolderUrl: "file:///C:/"     // 对话框目录路径

    FileDialog {
        id: fileDialog
        acceptLabel: "确定"
        rejectLabel: "取消"
        nameFilters: ["All (*)", "Text files (*.txt)", "HTML files (*.png *.jpg)"]
        folder: defaltFolderUrl
        onAccepted: {
            textArea.text = "当前路径:\n  "+defaltFolderUrl + "\n\n" + title + ":\n"
            for (var i in files) {
                textArea.text += "  " + files[i] + "\n"
            }
        }
        onFolderChanged: {
             defaltFolderUrl = folder;
        }
    }

    FolderDialog {
        id: folderDlialog
        acceptLabel: "确定"
        rejectLabel: "取消"
        folder: defaltFolderUrl
        options: FolderDialog.ShowDirsOnly
        onAccepted: {
            textArea.text = "当前路径:\n  "+defaltFolderUrl + "\n\n" + title + ":\n  "
            textArea.text += currentFolder
            defaltFolderUrl = currentFolder
        }
        onFolderChanged: {
             defaltFolderUrl = folder;
        }
    }

    RowLayout {
        anchors.fill: parent
        anchors.margins: 20
        spacing: 10


        ScrollView {
              id: view
              Layout.fillWidth: true
              Layout.fillHeight: true
              Layout.columnSpan: 3
              Layout.preferredWidth: 240
              Layout.preferredHeight: 300
              clip: true
              ScrollBar.vertical.policy: textArea.contentHeight > Layout.preferredHeight ?
                                             ScrollBar.AlwaysOn : ScrollBar.AlwaysOff;  // 如果文本内容高度大于显示高度,则一直显示垂直滑动条

              TextArea {
                id: textArea
                padding: 4
                implicitWidth: 240
                wrapMode: TextArea.WrapAnywhere
                text: "当前路径:\n  "+defaltFolderUrl
                font.pixelSize: 14
                background: Rectangle {
                      width: parent.width
                      height: parent.height
                      border.color: "#B0B0B0"
                      radius: 3
                }

              }
        }

        DynamicGroupBox {
             title: "请选择对话框"
             Layout.fillHeight: true
             Layout.fillWidth: false
             Layout.preferredWidth: 130  // 在GridLayout中要想固定指定宽度,必须使用preferredWidth,然后将fillWidth置为false
             Layout.preferredHeight: 300
             titleFontPixel: 15
             Column {
                 anchors.fill: parent
                 spacing: 12
                 DynamicBtn {
                     text: "打开单个文件"
                     backColor: "#5CA1F6"
                     fontPixelSize: 13
                     onPressed: {
                        fileDialog.title = text
                        fileDialog.fileMode = FileDialog.OpenFile
                        fileDialog.open()
                     }
                 }
                 DynamicBtn {
                     text: "打开多个文件"
                     backColor: "#56CDB7"
                     fontPixelSize: 13
                     onPressed: {
                        fileDialog.title = text
                        fileDialog.fileMode = FileDialog.OpenFiles
                        fileDialog.open()
                     }

                 }
                 DynamicBtn {
                     text: "保存文件"
                     backColor: "#4F64BA"
                     fontPixelSize: 13
                     onPressed: {
                        fileDialog.title = text
                        fileDialog.fileMode = FileDialog.SaveFile
                        fileDialog.currentFile = "file:///123.txt"
                        fileDialog.open()
                     }

                 }
                 DynamicBtn {
                     text: "选择文件夹"
                     backColor: "#F08140"
                     fontPixelSize: 13
                     onPressed: {
                        folderDlialog.title = text
                        folderDlialog.open()
                     }

                 }
             }
        }
    }

}