在拖放时提供拖放数据而不是拖动时间

时间:2011-11-02 11:01:06

标签: qt drag-and-drop

我有一个适用于Linux和Windows的Qt桌面应用程序。在某些时候,我希望将它移植到MacOS X和其他* nix系统。

我的问题是,应用程序的一部分具有允许用户将文件拖放到存档中和从存档中拖出文件的功能。 UI有点像WinZip或类似的基于GUI的归档程序。但Qt的拖放系统希望在用户开始从存档中拖动文件时准备好数据。

我目前所做的是,将拖动的文件解压缩到临时位置,并将这些文件名作为数据提供。但这是不可取的,因为提取深层目录树需要花费大量时间,并且会导致GUI在此期间冻结。如果我可以在用户决定删除文件时执行该操作,而不是在他/她开始拖动时,那将是很好的。不幸的是,Qt文档没有说明这一点。

我知道如何使用Windows API实现这一点,我很确定大多数系统都有办法实现这一点。但我希望尽可能避免编写特定于平台的代码。

有没有Qt方法来实现这一目标?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我可能会误解,但我认为您想要做的是在QMimeData中为您创建的QDrag提供足够的信息,您可以在用户删除文件后找到文件,而无需先将其解压缩。因此,如果drop end上的代码不知道文件来自哪个存档,则还需要在mime数据中提供存档的路径。

拖动作为消息开始: “我正在拖动Archive1:FileA,Archive1:FileB”但没有文件提取。

它通过解释消息然后解压缩文件而在另一端结束。我可能会为消息传输的双方设置某种简单的ICD。如果您一次只能从一个存档拖动,可能是一个字符串列表,其中第一个元素是存档,后面的文件是文件:

QStringList list;
list << archivePath;
list << fileName1;
list << fileName2;

QByteArray ba;
QDataStream stream(&ba);
stream << list;

QMimeData* mime = new QMimeData;
mime->setData("yourType", ba);

我希望这有帮助!