使用 Qt 拖放:在悬停时了解目标应用程序 - 有可能吗?
Posted
技术标签:
【中文标题】使用 Qt 拖放:在悬停时了解目标应用程序 - 有可能吗?【英文标题】:Drag and drop with Qt: Knowing target application on hover - is it possible? 【发布时间】:2011-11-07 12:11:16 【问题描述】:我目前正在探索从 Qt 应用程序拖放到未知目标应用程序的可能性。问题是 Qt 应用程序是否有可能接收有关将要接收丢弃的应用程序的信息(例如进程名称或标题)。
一个(编造的)示例可能是将绘图从 Qt 窗口拖动到文本编辑器或电子表格编辑器。前者以图像的形式提供数据,后者以数据点的形式提供。
Qt 似乎在一定程度上知道悬停时下降的底层目标是什么,因为在更改 DropAction 状态时会发出 actionChanged 信号。如果我没记错的话,似乎目标应用程序会查看拖动对象中包含的 mime 类型,并指示如果将操作放在那里,该操作将是什么。我也没有从 targetChanged 信号中得到任何东西(据我所知,它是在当前 Qt 应用程序中删除)。
任何指示都会有所帮助,我很乐意跟进。
【问题讨论】:
我一直认为操作系统/窗口管理器处理了这个问题,唯一一致(因此可移植)的部分是 MIME 类型数据的可见性。 你最终取得了成功吗?我目前正在做一些事情,并希望实现类似的功能。一个被拖到我的 Qt 窗口顶部的窗口,我想获取一些信息,例如(PID 和 X 显示编号)。目前我正在运行 Ubuntu 14.04,并认为这在 X 中应该是可能的 您可以向拖动 mime 数据添加多种数据类型。因此,在创建可拖动数据时,您可以放置图像和点数据(具有适当的 mime 类型),每个应用程序将决定它想要获取哪些数据 我同意@KamilKlimek,在我看来,依赖目标应用程序是一种非常危险的设计。如果用户有另一个软件来编辑文档而不是您期望的软件怎么办?如果该软件的未来版本更改名称怎么办?您应该只建议具有标准元数据的数据,而不是依赖任何特定的目标来适应(处理您必须提供的内容是目标的责任)。 @KamilKlimek 您的评论应该是公认的答案。 【参考方案1】:您可以向拖动 mime 数据添加多种数据类型。在创建可拖动数据时,您可以放置图像和点数据(使用适当的 mime 类型),每个应用程序将决定它接受哪些数据以及如何解释它。
更多详情请查看https://doc.qt.io/qt-5/dnd.html#dragging
【讨论】:
【参考方案2】:您无法真正知道哪个应用程序会收到您的投递。但是,这并不妨碍您在与拖放关联的缓冲区中包含不同格式的数据。 QMimeData 类提供了 setData 方法,该方法将 mimeType 作为第一个参数。您可以为给定的 mimetype 放置一些数据,而为不同的 mimeType 放置一些其他数据。它不会删除第一个。 自定义 mimeData 通常对应用程序中的 drop 更有用,但也有一些相对标准的 mimeData:setText、setHtml、setUrls、setImageData 和 setColorData。
通常情况下,您可以同时将一些文本和一些图像放在拖动中,接收应用程序应该选择它需要的那个。
【讨论】:
以上是关于使用 Qt 拖放:在悬停时了解目标应用程序 - 有可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
Qt - 在QGraphicScene中拖放时如何从项目中获取文本?