如何创建 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
函数中。
我有一个像这样从 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
函数中。