c++ - 在 Qt 中拖放多个对象

标签 c++ qt

我可以成功地将拖动对象拖放到任何应用程序,但是拖动多个项目的正确方法是什么?

//Create Drag Object
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
QImage myImage = QImage(currentPath);
drag->setPixmap(QPixmap::fromImage(myImage, Qt::AutoColor));

//Send Source File to Target Application
mimeData->setText(this->getPathToSource());
drag->setMimeData(mimeData);

//Start drag/drop operation
drag->exec();

最佳答案

剪贴板一次只能包含一个对象。但是这个对象可以以不同的格式存储。

例如,文档可以同时存储为文本、HTML 和 Doc。

当您将拖动光标移到应用程序上时,它会检查是否可以使用可用格式和(很少)数据来放置对象。

如果需要拖动多个对象,则需要使用mimeData->setData(mimeType, data)将描述对象的数据放置在剪贴板中。
其中 mimeType 是一个唯一的 QString,例如“mydatatype”。
dataQByteArray,包含有关对象(或对象内容)的信息。例如,QStringList可以存储如下:

 QStringList list;
 mimeData->setData("myapplication::stringlist", list.join(",").toUtf8());

这是反序列化:

if (mimeData->hasFormat("myapplication::stringlist"))
{
   QStringList list = QString::fromUtf8(mimeData->data("myapplication::stringlist")).split(",");
}

当然,您不能将此类数据放入另一个(不是您的)应用程序中。

编辑:
当您从 Windows 资源管理器中拖动文件时,它会在剪贴板中放置文件路径。
因此,如果您想拖动 2 张图像,您必须将它们保存在临时文件夹中才能使用这种方式。

Windows 资源管理器将一些 mime 类型放入剪贴板。我认为您可以使用的是 text/uri-list。它是一个文件名列表。每个文件名的格式为 file:///path。每个文件名都从一个新行开始。

关于c++ - 在 Qt 中拖放多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26755788/

相关文章:

c++ - 写入 UTF-8 BOM 时出现异常

c++ - 向量化数学函数的免费/开源 C/C++ 库?

c++ - __declspec(dllimport) 的真正含义是什么?

c++ - 重新绘制后如何在 qcustomplot 中重置 x 和 y 轴(Qt)

c++ - "enum class"是 C++ 中的类类型吗?

c++ - Qt调试报错: "while parsing target library list: not well-formed (invalid token)"

c++ - QT 无法包含文件 QtWebKitWidgets : No such file or directory

c++ - Qt、cmake 和 qhelpgenerator

qt - .exe无法通过QtCreator和Qt 4.8.1的外部运行。关于dll的问题

c++ - 创建阻塞队列