0

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

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

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

场景
我有2 个窗口需要QQuickItem交替绘制。我想把它渲染my_item到另一个窗口。只要我将父级设置my_item为另一个窗口,这一切都很好

// 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& 的副本并setParentItem对其进行操作。通过这样复制:

QQuickItem * item_copy = new QQuickItem(my_item);

问题:
但这似乎没有创建QQuickItem& 的副本,因此我没有看到my_itemon的副本the_other_window

问题:
我想知道的是,我怎样才能创建一个有效的副本 aQQuickItem到另一个指针QQuickItem * item_copy中并在另一个窗口上渲染它而不影响原始的可见性/状态QQuickItem

4

1 回答 1

2

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

实际上,QQuickItem 派生自 QObject ,它显式禁用了类似复制的操作(复制构造函数和赋值运算符),因此它们在任何 QQuickItem 派生类中也被禁用。即使你有一个 QQuickItem 的特定子类,你认为你知道如何复制它,你也不能为它实现“真正的”复制。

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

于 2017-09-08T13:01:02.650 回答