Я пытаюсь создать всплывающее диалоговое окно в своем браузерном приложении 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»:
Для моего непрофессионала это может означать, что диалог является локальным для устройства, на котором размещен сервер (на основе Linux, где моя рабочая станция ОБЫЧНО основана на Windows), но я не могу найти эту структуру каталогов нигде на этом устройстве. Это какой-то особый контекст, который существует на веб-сервере (lighttpd)? Это какое-то пользовательское пространство в контексте браузера? Есть ли что-то, что мне нужно сделать, чтобы «указать» FileDialog на локальную файловую систему на рабочей станции, с которой я хочу загрузить файл?
Я не очень хорошо разбираюсь в жаргоне/инструментах веб-разработки, поэтому моя попытка использовать Qt/WebAssembly для создания графического веб-интерфейса, поэтому, пожалуйста, простите меня за использование терминов, которые могут быть технически некорректными...
Я невероятно зол на себя за то, что недостаточно внимательно прочитал документацию.
Мне пришлось перейти с 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
, песочницах браузера и веб-вещах, просто чтобы понять, чего я не видел... Надеюсь, это поможет людям, имеющим похожая проблема...