Я запускаю приложение QML на рабочем столе Linux (KDE). Когда файл помещается в главное окно приложения QML, мне нужно получить путь к файлу и имя файла в виде текста (с префиксом «file: ///» или без него).
Если я перетаскиваю файл из файлового менеджера Dolphin в адресную строку Firefox текстовый URI (например, «file: ///home/user/Downloads/file.txt») помещается в адресную строку, и файл открывается в Firefox , Это показывает, что информация о перетаскивании файла доступна из ОС.
Еще один тест, который я могу выполнить с помощью созданного мной приложения QML (код приведен ниже), - это выделить какой-то текст (скажем, на веб-странице) и перетащить этот выбор в главное окно моего приложения. Это работает, и приложение получает и сохраняет все выделенное текстовое выделение.
Однако я не могу перетащить файлы в мое приложение QML. Я не понимаю, почему я могу перетащить выделенный текст, но не файл. Я предоставляю рабочий пример моего кода.
Тестирование на KDE, когда я помещаю файл в окно приложения QML, вызывается метод onDropped
. Там я делаю console.log, и drop.text
является пустым (а drag.source равен null).
Как происходит перетаскивание файлов (например, из файлового менеджера) к приложению QML, которое должно быть реализовано?
и QML:
import QtQuick.Window 2.2
import QtQuick 2.2
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.3
import QtQuick.Dialogs 1.0
ApplicationWindow {
id: rootId
visible: true
title: "Drag Drop MRE"
property int margin: 16
minimumWidth: 600
minimumHeight: 480
FileDialog {
id: fileDialog
title: "Choose File Attachment"
folder: shortcuts.home
onAccepted: {
attachments.text += fileDialog.fileUrls + '\n'
console.log("added attachment: " + fileDialog.fileUrls)
}
}
DropArea{
id: drop
enabled: true
anchors.fill: parent
anchors.margins: margin
Rectangle {
anchors.fill: parent
color: "green"
visible: parent.containsDrag
}
onEntered: console.log("entered DropArea")
onDropped:{
attachments.text += drop.text + '\n'
console.log("added attachment: " + drop.text)
console.log("drag.source: " + drag.source)
}
Drag.dragType: Drag.Automatic
GridLayout {
id: mainLayout
anchors.fill: parent
anchors.margins: margin
Label {
text: "Drag Drop MRE"
font.pixelSize: 16
Layout.row: 1
Layout.column: 1
}
GroupBox {
Layout.row: 2
Layout.column: 1
id: gridBox
Layout.fillWidth: true
GridLayout {
id: gridLayout
rows: 1
flow: GridLayout.TopToBottom
anchors.fill: parent
Label { text: "Attached files"
}
TextArea {
id: attachments
Layout.fillWidth: true
implicitHeight: 300
}
}
}
GroupBox {
Layout.row: 3
Layout.column: 1
id: rowBox
Layout.fillWidth: true
Row {
anchors.right: parent.right
id: rowLayout
Button {
id: attach_button
text: "Attach"
onClicked: fileDialog.open();
}
Button {
id: save_button
text: "Save"
onClicked: console.log(attachments.text)
}
Button {
id: exit_button
text: "Exit"
onClicked: Qt.quit()
}
}
}
}} // Grid Layout & Drop Area
}
Я нашел связанный вопрос, но все наоборот: Перетащите файл из приложения в исследователь. Может ли мое приложение выполнить копирование?
Я также собрал и запустил примеры Qt. К сожалению, примеры страдают от одной и той же проблемы, поэтому они не помогают решить проблему. Тем не менее, я прочитал, что то, что я пытаюсь сделать, может быть сделано. Я просто не нашел рабочего решения.