Qt 4.x:如何实现拖放到桌面或文件夹中?

Jer*_*ner 18 c++ directory desktop qt drag-and-drop

我用Qt 4.x编写了一个用C++编写的小文件传输应用程序...它登录到服务器,向用户显示服务器上可用的文件列表,并允许用户上传或下载文件.

这一切都很好; 您甚至可以从桌面(或从打开的文件夹)拖入文件,当您将文件图标放入server-files-list-view时,删除的文件将上传到服务器.

现在我也请求相反的操作...我的用户希望能够将文件从server-files-list-view拖到桌面上,或者拖到打开的文件夹窗口中,然后让它文件下载到该位置.

这似乎是一个合理的要求,但我不知道如何实现它.有没有办法让Qt应用程序找到与"drop event"发生位置相对应的目录,当图标被放到桌面上或打开文件夹窗口时?理想情况下,这将是一个基于Qt的平台中立机制,但如果不存在,那么MacOS/X和Windows(XP或更高版本)的平台特定机制就足够了.

有任何想法吗?

Har*_*ich 7

看看QMimeData它的文档,它有一个虚函数

virtual QVariant retrieveData  ( const QString & mimetype, QVariant::Type type ) const
Run Code Online (Sandbox Code Playgroud)

这意味着你拖到外面就可以相应地实现这个功能

class DeferredMimeData : public QMimeData
{
  DeferredMimeData(QString downloadFilename) : m_filename(downloadFilename)

  virtual QVariant retrieveData (const QString & mimetype, QVariant::Type type) const 
  {
    if (mimetype matches expected && type matches expected)
    {
       perform download with m_filename
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

延迟编码的例子示出了该原理.

您可能还必须覆盖hasFormatformats提供适当的类型,application/octet-stream可能是可能让您玩得最多的类型,您可能必须阅读Windows如何使用mime类型专门处理拖放.

我不知道你将如何提供保存文件的文件名,但你可能不得不进入windows方面.看看QWindowsMime可能的来源也有帮助.可能有一个多步骤过程,您将获得text/uri-list文件名数据的请求,然后application/octet-stream是数据请求.

希望这可以帮助

  • 对于研究此问题的其他人,2014年的延迟编码示例现在位于:http://qt-project.org/doc/qt-4.8/draganddrop-delayedencoding.html.其中的关键是:使用自定义的MimeData类,在调用retrieveData方法时发出信号.然后你可以找到掉落的地方. (3认同)