【问题标题】:Qt Drag and Drop to windows explorer: How do I know the dropped destination pathQt拖放到Windows资源管理器:我如何知道放置的目标路径
【发布时间】:2016-08-06 12:24:10
【问题描述】:

我要做的是显示在线文件的列表视图,就像 FTP 客户端列出 FTP 服务器上的所有文件一样,可以将任意一行或多行拖动到任何本地文件夹以保存拖动的文件在那里。

我计划通过以下步骤来实现:

  1. 初始化拖拽事件,并将选中文件的路径保存到服务器[完成]
  2. 子类 QMimeData 类,并覆盖retrieveData 函数,就像这个线程建议here [完成]
  3. 只需完成拖放过程,然后找到拖放的目标路径,比如 C:\somefolder\subfolder,然后下载那里的所有文件,工作完成。 【未完成】

但我无法找到任何地方来获取放置的目标路径,甚至无法通过处理 dragEnter\dragMove\dragLeave\drop 事件。我也进行了大量的谷歌搜索,发现了一些类似的问题,但从来没有任何可靠的答案。

请对此有所了解。这种解决方案甚至可以与 QT 一起使用吗?我应该如何获得目标路径或者有没有其他方法可以实现这个目标?

【问题讨论】:

  • Windows 不提供任何方法来发现放置的目标。它确实提供了一种执行asynchronous data transfer 的方法。我很确定你不能单独使用 Qt 来实现,你必须直接使用 Windows API。
  • @IgorTandetnik 谢谢回复,相信IAsyncOperation 或许能达到我想要的效果,但我选择了另一种方式。我只是给拖动事件一些不存在的文件作为 url 列表,所以拖动似乎正在发生。当然,当被删除时,什么都不会发生,因为文件 url 列表是假的。我只是在放置位置找到窗口 HWND,并尝试找到它的路径 [forums.codeguru.com/…],然后在那里下载我的文件。这当然是愚蠢的,但对我来说它更容易实现......
  • 如果我放在文件夹图标上会发生什么(因此文件应该进入的文件夹与打开的资源管理器窗口不是同一个文件夹)?或者在打印机图标上(我想,在这种情况下,Explorer 会想先放到临时目录中)?
  • @IgorTandetnik hmmmmm,很好的问题,没有考虑过。然后我会坚持使用 IAsyncOperation!谢啦。请发表您的评论作为答案,以便我标记它。如果我有任何结果,我会回来。
  • @IgorTandetnik 实际上,我读过它,但我认为这不是答案。在异步场景中,[Drop Target] 决定何时开始操作和 EndOperation,我的应用程序 [Drop Source] 无法控制整个过程。它带来的唯一好处是取消阻止源和目标,这不适合我的场景,即:[Drop Source],我的应用程序在被删除时,将首先从 Web 服务器下载拖动的文件,这可能需要几个小时,然后我告诉[Drop Target],现在可以复制文件了,在此之前,[Drop Target]应该在后台等待。

标签: c++ qt drag-and-drop


【解决方案1】:

对于正在搜索此内容的任何人,我可能会找到答案,但这并不容易,并且可能取决于平台。

经过大量(字面意思)搜索,我在FileZilla's 源代码中找到了解决方案,结果证明可以应对这种情况,您需要:

  1. 您需要一个 shell 扩展来监控(或其他)拖动过程
  2. 开始正常的拖放操作
  3. 鼠标放下时,什么都不做,让整个拖放过程结束
  4. 通过 shell 扩展,您可以获得实际的目标路径,然后将文件下载到那里。

如需了解技术详情,请访问FileZilla official website

我认为这仅适用于Windows,如果有人得到其他平台的答案,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多