如何通过QML DropArea获取浏览器拖拽的图片原始数据或QImage
如何通过QML DropArea获取浏览器拖拽的图片原始数据?
我目前使用DropArea组件实现拖拽文件到应用的功能,处理本地文件的代码运行正常:
import QtQuick 2.15 import QtQuick.Window 2.15 Window { id: root width: 640 height: 480 visible: true DropArea { id: dropArea anchors.fill: parent onEntered: { drag.accepted = drag.hasUrls } onDropped: { // 通过drop.urls处理文件 drop.accept() } } }
在onEntered中,当DragEvent包含URL时我会接受事件,onDropped里可以通过urls处理拖拽的本地文件。
但现在需要接收从浏览器拖拽的图片——这类图片不存在于本地文件系统,我希望直接获取原始图片数据来生成文件。
问题在于dropped信号的DragEvent drop对象里没有这类数据,我通过以下日志代码验证了这一点:
onDropped: { console.log("drop.urls: " + drop.urls) console.log("drop.html: " + drop.html) console.log("drop.text: " + drop.text) console.log("-----------------------") for (var i = 0; i < drop.formats.length; ++i) { console.log(drop.formats[i] + ": " + drop.getDataAsString(drop.formats[i])) } }
拖拽Qt文档中的Qt标志图片时,输出如下:
qml: drop.urls: https://doc.qt.io/ qml: drop.html: <html> <body> <!--StartFragment--><img src="https://doc.qt.io/style/qt-logo-documentation.svg" alt="Qt documentation"><!--EndFragment--> </body> </html> qml: drop.text: https://doc.qt.io/ qml: ----------------------- qml: application/x-qt-windows-mime;value="DragContext": qml: application/x-qt-windows-mime;value="DragImageBits": ? qml: application/x-qt-windows-mime;value="chromium/x-renderer-taint": qml: application/x-qt-windows-mime;value="FileGroupDescriptorW": qml: application/x-qt-windows-mime;value="FileContents": qml: text/x-moz-url: h qml: text/uri-list: https://doc.qt.io/ qml: application/x-qt-windows-mime;value="UniformResourceLocatorW": h qml: text/plain: https://doc.qt.io/ qml: text/html: <html> <body> <!--StartFragment--><img src="https://doc.qt.io/style/qt-logo-documentation.svg" alt="Qt documentation"><!--EndFragment--> </body> </html>
所有可用属性(包括通过formats获取的内容)里都没有原始图片数据。drop.html提供了图片的URL,但难道只能通过这个链接下载图片吗?
我还考虑过获取QMimeData来调用imageData()方法获取图片,看到Krita开发者有类似实现——他们把QMimeData定义为Q_PROPERTY传递到QML,但不确定这是不是最简单有效的方案。
所以核心问题是:能否通过标准QML DropArea组件直接获取浏览器拖拽而来的图片原始数据或QImage对象?
内容的提问来源于stack exchange,提问作者Pater Mark
相关产品推荐
相关产品推荐

