Как создать отдельную копию 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
функция.