QML 中的自定义文件对话框

Custom FileDialog in QML

我愿意使用 QML 中的 FileDialog,但事实证明它不适用于 SaveAs 情况(因为您无法指定不存在的文件名),而且感觉对话框不是真正的现代或移动。

作为解决方法,我决定构建一个简单的 MyFileDialog,如下所示:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Controls.Styles 1.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3

Popup
{
    implicitWidth: window.width / 3 * 2
    implicitHeight: window.height / 3 * 2
    x: (window.width - width) / 2
    y: 20
    modal: true
    focus: true

    property alias title: popupLabel.text

    contentItem: ColumnLayout
    {
        id: settingsColumn
        spacing: 20

        // Popup title.
        Label
        {
            id: popupLabel
            font.bold: true
            anchors.horizontalCenter: parent.horizontalCenter
        }

        // File path.
        TextField
        {
            id: field
            placeholderText: "File path..."
            implicitWidth: parent.width
        }

        // Buttons.
        RowLayout
        {
            spacing: 10

            Button
            {
                id: okButton
                text: "Ok"
                onClicked: { onOkClicked(); close();}

                Material.foreground: Material.primary
                Material.background: "transparent"
                Material.elevation: 0

                Layout.preferredWidth: 0
                Layout.fillWidth: true
            }

            Button
            {
                id: cancelButton
                text: "Cancel"
                onClicked: { state = false; }

                Material.background: "transparent"
                Material.elevation: 0

                Layout.preferredWidth: 0
                Layout.fillWidth: true
            }
        }
    }
}

现在我希望这个对话框可以在多种情况下重复使用,例如打开文件、导入文件、保存文件...但这意味着 okButton.onClicked 的行为在每种情况下都是不同的。

我已经尝试了几种方法来为 okButton.onClicked 指定自定义(或者说可更改的)行为,但到目前为止运气不佳。这是我尝试过的:

  1. 在 Popup
  2. 中创建 okButton.onClicked 的 属性 别名
  3. 定义 okButton.onClicked 我使用 Popup
  4. 在Popup外定义一个行为函数,提供给Popup

None 这些尝试都成功了,我总是遇到编译错误。

知道如何使我的代码可重用吗?

我在互联网上也找不到最新的干净示例,知道在哪里可以找到吗?

谢谢,

安托万。

QtQuick.Dialogs 导入的

FileDialog 有一个 selectExisting 属性,您可以使用它另存为:

Whether only existing files or directories can be selected.

By default, this property is true. This property must be set to the desired value before opening the dialog. Setting this property to false implies that the dialog is for naming a file to which to save something, or naming a folder to be created; therefore selectMultiple must be false.

如果您想要现代的移动界面,最好自己制作。不过,我不会选择对话框,因为它更以桌面为中心。例如,Dropbox 在其移动 UI:

中使用类似 ListView 的内容