QML: Как перетащить файл из проводника в мое приложение Qt Quick? - PullRequest
0 голосов
/ 13 января 2020

Я запускаю приложение 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. К сожалению, примеры страдают от одной и той же проблемы, поэтому они не помогают решить проблему. Тем не менее, я прочитал, что то, что я пытаюсь сделать, может быть сделано. Я просто не нашел рабочего решения.

1 Ответ

1 голос
/ 13 января 2020

Это должно работать (проверено на Windows):

Window {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Drop Area")

    DropArea {
        id: dropArea;
        anchors.fill: parent
        onEntered: {
            root.color = "gray";
            drag.accept (Qt.LinkAction);
        }
        onDropped: {
            console.log(drop.urls)
            root.color = "white"
        }
        onExited: {
            root.color = "white";
        }
    }
}
...