如何创建 QQuickItem 的单独副本并将其呈现在不同的 window

How create a separate copy of a QQuickItem & render it on a different window

我有一个像这样从 C++ 端获取的 QQuickItem

QQuickItem * my_item = qmlEngine->rootObjects()[0]->findChild<QQuickItem*>("ItemObjectName");

my_item 有效并且设置了所有属性。

场景
我有 2 windows 需要这个 QQuickItem 来交替绘制。我想将此 my_item 渲染为不同的 window。只要我将 my_item 的父级设置为另一个 window

// the_other_window is a QQuickWindow
QQuickWindow * the_other_window;

// here I set parent
my_item->setParentItem(the_other_window->contentItem());

这需要我再次 setParentItem 回到 my_item 的原始 window 否则它在原始 window 上不可见。这是有效的,但给了我不必要的依赖。相反,我正在尝试创建 QQuickItem 的副本并在其上执行 setParentItem。通过这样复制:

QQuickItem * item_copy = new QQuickItem(my_item);

问题:
但这似乎没有创建 QQuickItem 的副本,因此我没有在 the_other_window.

上看到 my_item 的副本

问题:
我想知道的是,如何在不影响 visibility/state 的情况下将 QQuickItem 创建到另一个指针 QQuickItem * item_copy 并将其呈现在不同的 window 上原创 QQuickItem?

QQuickItem 的接口不提供可克隆性。如果是这样,那么它的所有子classes 都必须重新实现一个虚拟clone() 函数。

事实上,QQuickItem 派生自 QObject,它显式禁用类似复制的操作(复制构造函数和赋值运算符),因此它们在任何 QQuickItem 派生的 class 中也被禁用。即使您有 QQuickItem 的特定子class,您认为您知道如何复制,您也无法为它实现"real"复制。

在后一种情况下,最接近的做法是实例化一个新的空白项目,然后手动将相关属性的所有值从旧实例复制到新实例。您可以将代码封装在 copy 函数中。