我可以成功地将拖动对象拖放到任何应用程序,但是拖动多个项目的正确方法是什么?
//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();
答案 0 :(得分:4)
剪贴板一次只能包含一个对象。但是这个对象可以以不同的格式存储。
例如,文档可以同时作为HTML和Doc存储为文本。
当您在应用程序上移动拖动光标时,它会检查是否可以使用可用格式和(很少)数据删除对象。
如果您需要拖动多个对象,则需要使用mimeData->setData(mimeType, data)
将描述对象的数据放在剪贴板中。
其中mimeType
是唯一的QString
,例如“mydatatype”
data
是QByteArray
关于对象(或对象内容)的信息。例如,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
。每个文件名都从一个新行开始。