如何在从c++到QML再到c++的传递过程中避免对象复制

How to avoid objects copying during passing from C++ to QML and again to C++?

本文关键字:c++ 过程中 复制 对象 再到 QML      更新时间:2023-10-16

我尝试从c++加载QImage到QML。因此,我已经创建了QQuickPaintedItem的子类,其中我使用slot加载我的QImage(转换为QVariant)(这意味着我在这种情况下仅使用QML作为传输)。但是我只有一个问题:我通过值传递QImage,并且我知道我不能使用引用和指针从QML传递参数到c++。

那么,是否有一些技巧可以避免对象在从c++到QML再到c++的传递过程中复制?

这个"技巧"是Qt内置的:像许多其他包含数据的类一样,QImage使用隐式数据共享AKA copy-on-write/CoW,引用自Qt5文档:

QImage对象可以按值传递,因为QImage类使用隐式数据共享。

文档中的

Link提供了更多关于这在Qt上下文中意味着什么的细节,但简而言之,实际的QImage实例非常小,并且作为值传递非常便宜。它基本上只是一个指向具有引用计数的共享数据的指针。当一个实例被修改时,如果引用计数大于1,它首先被分离(深度复制),但当不修改时,它只是在指针周围复制。