QML中的自定义FileDialog

时间:2016-07-26 17:27:05

标签: qt qml qtquick2 qt-quick

我愿意使用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中设置 okButton.onClicked 的属性别名
  2. 定义 okButton.onClicked ,我使用Popup
  3. 在Popup外定义行为函数并将其提供给Popup
  4. 这些尝试都没有奏效,而且我总是有编译错误。

    有什么想法可以让我的代码重复使用吗?

    另外,我在互联网上找不到最新且干净的例子,我知道在哪里可以找到它吗?

    谢谢,

    安托。

1 个答案:

答案 0 :(得分:4)

来自FileDialog导入的

QtQuick.Dialogs有一个selectExisting属性,您可以将其保存为:

  

是否只能选择现有文件或目录。

     

默认情况下,此属性为true。在打开对话框之前,必须将此属性设置为所需的值。将此属性设置为false意味着该对话框用于命名要保存内容的文件,或命名要创建的文件夹;因此selectMultiple必须为false。

如果你想要一个现代化的移动界面,你最好自己制作。但是,我不打算使用对话框,因为它更加以桌面为中心。例如,Dropbox在其移动UI中使用类似ListView的内容:

dropbox