【问题标题】:Qt: Pass pointer to QObject in QMimeDataQt:将指针传递给 QMimeData 中的 QObject
【发布时间】:2011-05-14 18:16:52
【问题描述】:

是否可以在拖放操作期间使用 QMimeData 传递指向 QObject 的指针? QMimeData只有这个存储数据的功能:

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

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

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

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

谢谢 安东

【问题讨论】:

    标签: qt pointers drag-and-drop qobject


    【解决方案1】:

    你可以继承 QMimeData 并传递你想要的任何东西。

    【讨论】:

      【解决方案2】:

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

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

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

      我知道您也可以使用 mime 类型在一定程度上直接确定有效负载可能被丢弃的位置和不被丢弃的位置。然而,精髓是您应该保持在 mime 概念内。这包括不传递原始指针。

      【讨论】:

      • "最脏的方法是标识符是指针地址为 int。" - 是的,在 64 位系统上又脏又坏。 :)
      • 我假设如果 OP 决定投,他会投正确的:D
      • @Frank:为什么? int 在 64 位系统上是 64 位
      • @galinette:错了! int 在大多数 64 位系统上保持 32 位。请参阅viva64.com/en/k/0005 或自行测试:std::cout << sizeof(int) << "\t" << std::numeric_limits<int>::max() << std::endl;
      • Google top result for my search... 如果您有多个应用程序实例并将一个对象从第一个应用程序拖动到第二个应用程序,第二个应用程序将获得一个对它没有意义的指针(它对第一个应用程序)。如果你只是取消这个整数.... 崩溃!如果您有一个容器,您实际上可以检查指针与容器中的项目,并且只有在它已经存在时才取消引用它:)
      【解决方案3】:

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

      然后,添加以下内容:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        • 2011-01-19
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        相关资源
        最近更新 更多