Пользовательский FileDialog в QML

Я был готов использовать FileDialog из QML, но он оказывается неприменимым для ситуаций 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. Сделать псевдоним свойства okButton.onClicked в Popup
  2. Определите okButton.onClicked, где я использую всплывающее окно
  3. Определите функцию поведения вне Popup и предоставьте ее Popup

Ни одна из этих попыток не сработала, и у меня всегда есть ошибки компиляции.

Любая идея о том, что я мог сделать мой код многоразовым?

Кроме того, я не смог найти ни одного свежего и свежего примера в Интернете, есть идеи, где я мог бы это найти?

Спасибо,

Антуан.

1 ответ

Решение

FileDialog от QtQuick.Dialogs импорт имеет selectExisting свойство, которое вы можете использовать, чтобы сохранить как:

Могут ли быть выбраны только существующие файлы или каталоги.

По умолчанию это свойство имеет значение true. Это свойство должно быть установлено на желаемое значение перед открытием диалога. Установка этого свойства в false подразумевает, что диалоговое окно предназначено для именования файла, в который нужно что-то сохранить, или для имени создаваемой папки; поэтому selectMultiple должно быть ложным.

Если вам нужен современный мобильный интерфейс, вам лучше создать свой собственный. Я бы не стал использовать диалог, так как он больше ориентирован на рабочий стол. Dropbox, например, использует что-то вроде ListView в своем мобильном интерфейсе:

раздаточная

Другие вопросы по тегам