3

是否可以在拖放操作期间使用 QMimeData 将指针传递给 QObject?QMimeData 只有这个函数用于存储数据:

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

但我找不到将指针安全编码为 QByteArray 的方法。

为了阐明我的目标:我需要在拖放操作期间将指向 QObject 的指针从模型传递到目标小部件。

编辑:据我所知,Mime 数据就是将应用程序独立数据从一个地方传递到另一个地方:url、颜色、html 代码。在我的情况下,我需要在应用程序中传递一个指向资源对象的指针。你通常如何处理这种拖放?

谢谢安东

4

3 回答 3

5

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

于 2010-11-23T21:56:07.677 回答
2

为了安全和优雅,我会为我的对象提供唯一标识符(例如字符串或数字)并将它们作为 mime 对象传递。使用 QHashmap 将字符串解析回相应的对象对于您的目的来说已经足够快了。

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

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

我知道你也可以使用 mime 类型,在某种程度上直接知道有效载荷可能被丢弃的地方和不被丢弃的地方。然而,精髓是你应该停留在哑剧概念之内。这包括不传递原始指针。

于 2010-11-23T23:15:38.647 回答
1

正如 Kash 所说和 Qt 文档所建议的那样,子类 QMimeData

然后,添加以下内容:

  • 描述或表示拖动对象的文本/普通数据,因此如果将此数据拖放到 notepad.exe,它会产生相关的结果
  • 具有标识符或令牌的自定义数据类型,使您能够知道某些丢弃的 mime 数据实际上是您的子类
  • 在子类中添加自己的数据

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

于 2016-03-21T08:54:33.620 回答