【发布时间】:2014-02-13 02:04:21
【问题描述】:
我正在寻找一种干净且跨平台的方法来防止将项目从 Qt 应用程序拖放到 Windows 文件资源管理器(或其他操作系统等效项)
下图显示了所需的行为:
我没有运气在网上找到示例或一起破解解决方法,但它似乎是一个足够常见的用例,会有一个设计和实施良好的解决方案。
我尝试过但没有工作:
-
检测拖拽并杀死它:
- 检测QDragEnterEvent、QDragMoveEvent、QDragLeaveEvent
- 将事件的 answerRect() 或 pos() 与几何 用于检测拖动是否离开应用程序的 Window 或 Widget
这很 hacky(而且暂时不工作),我希望你能指出我更优雅的解决方案。
(更新 - 尝试更改 mimeType,但 Windows 文件资源管理器仍然接受删除)
-
将 MIME 类型更改为自定义类型:
- Pre:上图中的“带拖放功能的小部件”是
QTreeView和QFileSystemModel模型 - 子类化
QFileSystemModel并覆盖mimeTypes()函数,如下面的代码 - 从
qDebug()输出中,看起来mimeType 设置正确,但Windows 文件资源管理器仍然接受drop:/
- Pre:上图中的“带拖放功能的小部件”是
QStringList MyFileSystemModel::mimeTypes() const { QStringList customMimeTypes; customMimeTypes << QString("UnicornsAndRainbows/uri-list"); qDebug() << "customMimeTypes: " << customMimeTypes; return customMimeTypes; }
如果有机会请告诉我。
谢谢! :)
【问题讨论】:
-
只需将 mime 类型填充到任何自定义字符串。
-
在检查
dropEvent上的mimeType之后,我发现我的上述实现没有正确设置mimeType。我目前有一些来自4.8 Drag and Drop Documentation 的用于我的用例的代码,一旦我清理它就会发布我的代码。谢谢德米特里! :)
标签: c++ qt drag-and-drop