【问题标题】:Drag and Drop a file outside a Qt5 application将文件拖放到 Qt5 应用程序之外
【发布时间】:2017-10-12 11:28:27
【问题描述】:

我正在尝试在我的 Qt5 应用程序中创建一个按钮,该按钮可以拖到应用程序外部,并且在拖放时会将文件复制到该位置。

以谷歌浏览器为例。下载文件后,可以将其从显示在窗口底部的列表中拖到任何其他位置,例如目录。

是否有任何专门的小部件来完成这项任务,还是我必须自己编写一个?如果是这样,怎么做?我是一名有能力的 C++ 程序员,但对 Qt 框架没有多少经验。

【问题讨论】:

  • 如果重要的话,这是一个 zip 存档,我正试图将其拖到程序之外。

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


【解决方案1】:

你试过Draggable Text Example吗?

dragwidget.cpp 文件中,如果您查看函数 mousePressEvent, 你可以看到 QDrag 需要 mimeData

QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData); 

Mimedata 定义您的 QDrag 行为,例如拖动图像、文件或文本或其他任何内容。

如果你想告诉窗口你的拖拽中有文件,你需要在你的 mimedata 中添加一个 URL,比如:

mimeData->setUrls(QList<QUrl>() << QUrl::fromLocalFile("D:/test.txt"));

在 draggabletext 示例中,mimedata 包含文本,您可以在 [158:161] 行看到。

但是如果你替换现有的:

mimeData->setText(child->text());
mimeData->setData(hotSpotMimeDataKey(),
                  QByteArray::number(hotSpot.x()) + ' ' + 
QByteArray::number(hotSpot.y()));

mimeData->setUrls(QList<QUrl>() << QUrl::fromLocalFile("D:/test.txt"));

当您在 windows 资源管理器中拖动文本时,windows 将接受它并将文件复制到您放置它的位置。

【讨论】:

  • 什么是孩子? hotSpotMimeDayaKey 是什么?不是很清楚,伙计。
  • 我已经编辑了我的评论,很抱歉我的英语不好
  • 请记住,如果您尝试以 Linux 为目标,您需要更进一步,同时使用 setUrlssetText,后者的格式如 @ 中所述Mozilla 文档的 987654323@ 部分,用于实现拖放的 Web 应用程序。 (除了 PCManFM 的 GTK+ 2.x 版本之外,我测试的所有内容都可以得到,我假设有必要将建议的拖动动作覆盖为CopyAction | MoveAction | LinkAction 而不仅仅是CopyAction。)
猜你喜欢
  • 2012-08-30
  • 2013-03-06
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多