Как создать отдельную копию QQuickItem и визуализировать ее в другом окне

У меня есть 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_item на the_other_window,

Вопрос:
Все, что я хочу знать, это как я могу создать действительную копию QQuickItem в другой указатель сказать QQuickItem * item_copy & визуализировать его в другом окне, не влияя на видимость / состояние оригинала QQuickItem?

1 ответ

Решение

Интерфейс QQuickItem не обеспечивает клонируемости Если бы это было так, то все его подклассы должны были бы переопределить виртуальный clone() функция.

Действительно, QQuickItem является производным от QObject, который явно отключает копирующие операции (конструктор копирования и оператор присваивания), поэтому они также отключены в любом производном от QQuickItem классе. Даже если у вас есть определенный подкласс QQuickItem, который, по вашему мнению, вы знаете, как копировать, вы не сможете реализовать для него "настоящее" копирование.

В последнем случае наиболее близким является создание нового пустого элемента вашего типа и ручное копирование всех значений соответствующих свойств из старого в новый экземпляр. Вы можете инкапсулировать код, который в copy функция.

Другие вопросы по тегам