QT C++ 我可以使用自定义 mime 类型在多个应用程序上进行复制和粘贴吗?

Posted

技术标签:

【中文标题】QT C++ 我可以使用自定义 mime 类型在多个应用程序上进行复制和粘贴吗?【英文标题】:QT C++ Can I use Custom mime-type for copy and paste on multiple application? 【发布时间】:2016-10-17 08:38:30 【问题描述】:

最近,我做了一些使用自定义 mime-type 进行复制和粘贴的应用程序。

我将 vs2015 与 Qt 5.7.0 一起使用。

在单个应用中,复制粘贴效果很好,

但是当我执行 A.exe 和 A'.exe(由相同代码构建的相同应用程序)时,

自定义 mime-type 和 qclipboard 在 A.exe 和 A'.exe 之间无法正常工作

否则,每个应用程序的功能都可以正常工作。

当我在 A.exe 上复制数据并将其粘贴到 A'.exe 时,自定义 Mimedata 为 NULL。

有什么方法可以不使用 QbyteArray 来解决这个问题吗?

以下是我的简要功能。

复制:

QClipboard* _clipboard = QApplication::clipboard();

mycustomMimedata* _Mimedata = new mycustomMimedata();

_clipboard->setMimeData(_Mimedata);

粘贴:

QClipboard* _clipboard = QApplication::clipboard();

const mycustomMimedata* _mimeData = 
qobject_cast<const mycustomMimedata*>(_clipboard->mimeData());

【问题讨论】:

【参考方案1】:

您分配的内存归创建它的进程所有。其他进程无法访问它。你在这里有 2 个不同的进程。

当您分配mycustomMimedata 并将其存储在mime 数据中时,您实际上是在mime 数据中存储了一个指针。这可能在您的应用程序 A.exe 中有地址 5(只是一个随机数)。

现在另一个应用程序有他自己的内存,在地址 5 上什么都没有,或者可能是别的东西。因此,当您“粘贴”时,您会说“从内存地址 5 中获取一些东西”,而 Qt 似乎足够聪明,可以知道这是无效的并给您一个空指针。


可能的解决方案:

如果您只需要“复制”,则可以使类可序列化并将此数据设置为 MIME 值并在粘贴操作时对其进行反序列化。或者,如果您从数据库加载它,请使用 ID 在您的其他应用程序中重新加载该对象。

如果您使用的是非 POD 类型,则将数据复制到 QByteArray 可能会很危险。如果是 POD 应该保存。

如果您需要在两个应用程序中操作同一个实例,您需要进入 IPC 和 shared_memory。幸运的是,Qt 也实现了这些。尽管对于这个答案,这可能会变得过于广泛,但 Qt 有很好的文档和示例:http://doc.qt.io/qt-5/qtcore-ipc-sharedmemory-example.html

【讨论】:

谢谢海特。我会试试你的建议。

以上是关于QT C++ 我可以使用自定义 mime 类型在多个应用程序上进行复制和粘贴吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Android 中创建自定义图像 MIME 类型吗?

如何将 Qt 属性与自定义类一起使用?

如何在 Qt 中获取文件的 MIME 类型?

PHP 文件的自定义 MIME 类型

qt creator源码全方面分析(2-0)

Rails 3 和 JSON:默认渲染器,但自定义 mime 类型