gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:37:41 25 4
gpt4 key购买 nike

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

我在 Qt 5.7.0 中使用 vs2015。

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

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

自定义 mime 类型和 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());

最佳答案

您分配的内存由创建它的进程所有。其他进程无法访问它。这里有 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

关于c++ - QT C++ 我可以使用自定义 mime 类型在多个应用程序上进行复制和粘贴吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40081849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com