Можно ли использовать QML FileDialog для выбора загрузки файла из веб-браузера?

Я пытаюсь создать всплывающее диалоговое окно в своем браузерном приложении Qt/QML, чтобы выбрать файл на моей рабочей станции загрузить к устройству, на котором запущен веб-сервер. Я не уверен, в каком «контексте» работает FileDialog при вызове нажатием кнопки в браузере. Является ли он локальным для устройства, на котором работает сервер и размещает страницу, или он является локальным для рабочей станции, на которой запущен браузер?

У меня есть следующий код в QML, взятый из примера в FileDialog документации:

FileDialog {
    id: fileDialog
    title: "Please choose a file"

    folder: shortcuts.home
    onAccepted: {
        console.info("You chose: " + fileDialog.fileUrls)
        //Do the data_client stuff and get the file moving
        client.getUploadFile(fileUrls)
    }
    onRejected: {
        console.info("Canceled")
    }
}

Это диалоговое окно отображается со следующим:

Button {
    id: uploadButton
    x: 224
    y: 14
    text: qsTr("Upload")
    onClicked: {
        fileDialog.open()
    }
}                            

Проблема, которую я вижу в настоящее время, заключается в том, что при открытии диалоговое окно дает мне некоторое «пространство» файловой системы, о котором я понятия не имею. Независимо от того, работаю ли я на компьютере с Windows или Linux, я получаю следующий диалог в каталоге «/home/web_user»:

Можно ли использовать QML FileDialog для выбора загрузки файла из веб-браузера?

Для моего непрофессионала это может означать, что диалог является локальным для устройства, на котором размещен сервер (на основе Linux, где моя рабочая станция ОБЫЧНО основана на Windows), но я не могу найти эту структуру каталогов нигде на этом устройстве. Это какой-то особый контекст, который существует на веб-сервере (lighttpd)? Это какое-то пользовательское пространство в контексте браузера? Есть ли что-то, что мне нужно сделать, чтобы «указать» FileDialog на локальную файловую систему на рабочей станции, с которой я хочу загрузить файл?

Я не очень хорошо разбираюсь в жаргоне/инструментах веб-разработки, поэтому моя попытка использовать Qt/WebAssembly для создания графического веб-интерфейса, поэтому, пожалуйста, простите меня за использование терминов, которые могут быть технически некорректными...

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я невероятно зол на себя за то, что недостаточно внимательно прочитал документацию.

Мне пришлось перейти с QGuiApplication на QApplication, чтобы использовать виджеты, добавить "виджеты" в строку "QT +=" моего проекта, изменить QML для вызова бэкэнда вместо того, чтобы пытаться вызывать FileDialog прямо в QML, и вызовите соответствующую функцию, как указано в документации QFileDialog...

Теперь QML:

Button {
    id: uploadButton
    x: 224
    y: 14
    text: qsTr("Upload")
    onClicked: {
        client.getUploadFile();
    }
}

В бэкенде С++:

auto fileContentReady = [](const QString &fileName, const QByteArray &fileContent) {
    if (fileName.isEmpty()) {
        // No file was selected
    } else {
        qDebug() << "File name: " + fileName;
    }
};

void Data_Client::getUploadFile()
{
    QFileDialog::getOpenFileContent("Images (*.png *.xpm *.jpg)",  fileContentReady);
//...
}

Все это довольно четко определено в документации для getOpenFileContent(), но мне пришлось так много понимать о emscripten, песочницах браузера и веб-вещах, просто чтобы понять, чего я не видел... Надеюсь, это поможет людям, имеющим похожая проблема...

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