【问题标题】:Supplying the data for drag and drop at drop time instead of drag time在放置时而不是拖动时提供用于拖放的数据
【发布时间】:2011-11-02 11:01:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: qt drag-and-drop


    【解决方案1】:

    我可能会误解,但我认为您想要做的是在 QMimeData 中为您创建的 QDrag 提供足够的信息,以便您可以在用户删除存档后在存档中找到文件,而无需先提取它们。因此,如果放置端的代码不知道文件来自哪个存档,您也需要在 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);
    

    我希望这会有所帮助!

    【讨论】:

    • 谢谢!但是另一边(放置站点)是系统的文件管理器(即 Windows Explorer、Nautilus、Konqueror 等),所以我无法控制它。我需要在我的模型的mimeData() 中提供文件路径列表。由于文件在存档中,我需要先将它们提取出来,以使文件路径有效。我正在尝试找出是否有办法将该操作推迟到用户实际将它们放入文件管理器中。
    • @cyco130 我明白了!我确实误会了。这对你有帮助吗? doc.trolltech.com/4.6/draganddrop-delayedencoding.html
    • 谢谢!这并不理想,但可以工作。我会在我尝试后接受你的回答,如果没有更好的结果:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多