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 类型在多个应用程序上进行复制和粘贴吗?的主要内容,如果未能解决你的问题,请参考以下文章