QT c++可以使用自定义mime类型在多个应用程序上复制和粘贴

QT C++ Can I use Custom mime-type for copy and paste on multiple application?

本文关键字:程序上 应用程序 应用 复制 可以使 c++ 自定义 mime 类型 QT      更新时间:2023-10-16

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

我使用vs2015与Qt 5.7.0。

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

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

custom - time -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());

您分配的内存由创建它的进程拥有。其他进程不能访问它。这里有两个不同的进程

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

现在另一个应用程序有他自己的内存,在地址5什么也没有,或者可能有别的东西。所以当你"粘贴"时,你说"从内存地址5给我一些东西",Qt似乎足够聪明,知道这是无效的,并给你一个空指针。


可能的解决方案:

如果你只需要一个"拷贝",你可以使这个类序列化,并将这个数据设置为MIME值,并在粘贴操作时反序列化它。或者,如果您从数据库中加载它,则使用该ID在其他应用程序中重新加载该对象。

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

如果需要在两个应用程序中操作同一个实例,则需要进入IPC和shared_memory。幸运的是Qt也实现了这些功能。这个回答可能太宽泛了,但是Qt有很好的文档和例子:http://doc.qt.io/qt-5/qtcore-ipc-sharedmemory-example.html