Qt:在QMimeData中传递指向QObject的指针

时间:2010-11-23 21:47:01

标签: qt pointers drag-and-drop qobject

在拖放操作期间,是否可以使用QMimeData将指针传递给QObject? QMimeData仅具有此功能用于存储数据:

void QMimeData::setData(constQString &mimeType, const QByteArray &data)

但我无法找到一种方法将指针安全地编码为QByteArray。

澄清我的目标:在拖放操作期间,我需要将一个指向QObject的指针从模型传递到目标小部件。

编辑: 据我所知,Mime数据是关于将应用程序独立数据从一个地方传递到另一个地方:网址,颜色,HTML代码。在我的情况下,我需要将一个指针传递给应用程序中的资源对象。你怎么经常处理这种拖拽?

由于 安东

3 个答案:

答案 0 :(得分:4)

您可以继承QMimeData并传递您想要的任何内容。

答案 1 :(得分:2)

保持安全&优雅的一面,我会为我的对象提出唯一的标识符(例如字符串或数字),并将它们作为mime对象传递。使用QHashmap将字符串解析回相应的对象足够快。

最脏(不推荐!)的方式是标识符是指针地址为int。

如果您通过用户交互传递mime数据,您永远不会知道它的去向。如果用户将指针放到另一个应用程序的窗口上,它应该最好地满足用户的期望。 获取一个受损的mime对象并崩溃的应用程序是最糟糕的。 获取描述性字符串并使用户能够理解他丢弃的内容的应用程序可能是最佳的。

我知道你也可以使用mime类型,在有效负载可能被丢弃的地方有点直接,而不是。然而,典型的是你应该保持在哑剧概念。这包括不传递原始指针。

答案 2 :(得分:0)

正如Kash所说,Qt文档建议subclass QMimeData

然后,添加以下内容:

  • 描述或表示拖动对象的text / plain数据,因此,如果将此数据删除到notepad.exe,则会产生相关的内容
  • 带有标识符或令牌的自定义数据类型,使您可以知道某些已删除的mime数据实际上是您的子类
  • 在子类中添加您自己的数据

您仍然需要测试qobject_cast(或dynamic_cast),因为其他一些程序可能已经代理了您的mime数据对象。