最近,我做了一个使用自定义mime-type复制和粘贴的应用程序。
我在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++我可以使用Custom mime-type在多个应用程序上进行复制和粘贴吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40081849/