Пользовательский 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, но пока безуспешно. Вот что я попробовал:
- Сделать псевдоним свойства okButton.onClicked в Popup
- Определите okButton.onClicked, где я использую всплывающее окно
- Определите функцию поведения вне Popup и предоставьте ее Popup
Ни одна из этих попыток не сработала, и у меня всегда есть ошибки компиляции.
Любая идея о том, что я мог сделать мой код многоразовым?
Кроме того, я не смог найти ни одного свежего и свежего примера в Интернете, есть идеи, где я мог бы это найти?
Спасибо,
Антуан.
1 ответ
FileDialog
от QtQuick.Dialogs
импорт имеет selectExisting
свойство, которое вы можете использовать, чтобы сохранить как:
Могут ли быть выбраны только существующие файлы или каталоги.
По умолчанию это свойство имеет значение true. Это свойство должно быть установлено на желаемое значение перед открытием диалога. Установка этого свойства в false подразумевает, что диалоговое окно предназначено для именования файла, в который нужно что-то сохранить, или для имени создаваемой папки; поэтому selectMultiple должно быть ложным.
Если вам нужен современный мобильный интерфейс, вам лучше создать свой собственный. Я бы не стал использовать диалог, так как он больше ориентирован на рабочий стол. Dropbox, например, использует что-то вроде ListView
в своем мобильном интерфейсе: