如何创建QQuickItem&的单独副本在不同的窗口上呈现它

时间:2017-09-08 12:56:33

标签: qt qml qqmlcomponent qquickitem qqmlapplicationengine

我从C ++那里获得QQuickItem就像这样。

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

my_item有效&amp;已经设置了所有属性。

方案
我有 2个窗口,需要这个QQuickItem来替代地绘制。我想将此my_item呈现给不同的窗口。只要我将my_item的Parent设置为另一个窗口

,这就完全可以正常工作
// the_other_window is a QQuickWindow
QQuickWindow * the_other_window;

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

这要求我再次setParentItem返回my_item的原始窗口,否则它会在原始窗口中隐藏。这是有效的,但给了我不必要的依赖。相反,我正在尝试创建QQuickItem&amp;的副本。对此进行setParentItem。通过这样复制:

QQuickItem * item_copy = new QQuickItem(my_item);

问题:
但这似乎并没有创建QQuickItem&amp;的副本。因此我在my_item上看不到the_other_window的副本。

问题:
我想知道的是,我如何创建一个有效的副本QQuickItem到另一个指针QQuickItem * item_copy&amp;在不影响原始QQuickItem的可见性/状态的情况下在不同的窗口上呈现它?

1 个答案:

答案 0 :(得分:2)

QQuickItem的界面不提供克隆性。如果确实如此,则其所有子类都必须重新实现虚拟clone()函数。

实际上,QQuickItem派生自QObject,它明确禁用类似复制的操作(复制构造函数和赋值运算符),因此它们也会在任何QQuickItem派生类中被禁用。即使你有一个QQuickItem的特定子类,你认为你知道如何复制,你也可以实现&#34; real&#34;复制它。

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