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

  • 本文关键字:拖放 数据 qt drag-and-drop
  • 更新时间 :
  • 英文 :


我有一个Qt桌面应用程序,可以在Linux和Windows上工作。在某种程度上,我也希望将它移植到MacOS X和其他*nix系统。

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

我目前所做的是,将拖动的文件提取到临时位置,并将这些文件名作为数据提供。但这是不可取的,因为提取深层目录树需要花费大量时间,并且会导致GUI在此期间冻结。如果我能在用户决定拖放文件时执行该操作,而不是在他/她开始拖拽时执行该操作,那就太好了。遗憾的是,Qt文档对此没有任何说明。

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

是否有Qt的方式来实现这一点?我错过什么了吗?

我可能误解了,但我认为您想要做的是在QMimeData中为您创建的QDrag提供足够的信息,以便在用户丢弃文件后可以在存档中找到文件,而不必首先提取它们。因此,如果拖放端的代码不知道文件来自哪个存档,则还需要在mime数据中提供存档的路径。

拖放开始时是一条消息:"I'm drag 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);

我希望这对你有帮助!

最新更新