Как создать новую копию QQuickItem с нуля на стороне C++ с теми же свойствами, что и у существующей
У меня есть 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);
Вопрос: хочу сделать item_copy
так же, как my_item
, Я узнал что QQuickItem
не копируется Итак, хотите установить все свойства my_item
в item_copy
, Таким образом воссоздавая my_item
с нуля. Как я могу это сделать? Какие свойства я должен копировать в первую очередь? ширина, высота, х, у и что еще?
Есть ли способ скопировать все действительные свойства в это новое, не копируя каждое по одному?
1 ответ
Чтобы скопировать все свойства, вы должны использовать metaobject()
Благодаря этому мы получаем свойства и можем копировать их, как показано ниже. Примечание: не все свойства могут быть записаны, для этого мы проверяем методом isWritable()
:
QQuickItem *copyQQuickItem(QQuickItem *item){
QQuickItem *item_Copy = new QQuickItem;
const QMetaObject *mo = item->metaObject();
for (int i = mo->propertyOffset(); i < mo->propertyCount(); ++i){
if(mo->property(i).isWritable()){
const char* name = mo->property(i).name();
item_Copy->setProperty(name, item->property(name));
}
}
return item_Copy;
}
Пример:
QQuickItem * my_item = engine.rootObjects()[0]->findChild<QQuickItem*>("ItemObjectName");
QQuickItem *item_copy = copyQQuickItem(my_item);
const QMetaObject *mo = my_item->metaObject();
for (int i = mo->propertyOffset(); i < mo->propertyCount(); ++i){
if(mo->property(i).isWritable()){
const char* name = mo->property(i).name();
qDebug()<<name<<my_item->property(name)<<item_copy->property(name);
Q_ASSERT(my_item->property(name)==item_copy->property(name));
}
}
Выход:
parent QVariant(QQuickItem*, QQuickRootItem(0x55975cfdf520)) QVariant(QQuickItem*, QQuickRootItem(0x55975cfdf520))
x QVariant(double, 0) QVariant(double, 0)
y QVariant(double, 0) QVariant(double, 0)
z QVariant(double, 0) QVariant(double, 0)
width QVariant(double, 100) QVariant(double, 100)
height QVariant(double, 100) QVariant(double, 100)
opacity QVariant(double, 1) QVariant(double, 1)
enabled QVariant(bool, true) QVariant(bool, true)
visible QVariant(bool, true) QVariant(bool, true)
state QVariant(QString, "") QVariant(QString, "")
baselineOffset QVariant(double, 0) QVariant(double, 0)
clip QVariant(bool, false) QVariant(bool, false)
focus QVariant(bool, false) QVariant(bool, false)
activeFocusOnTab QVariant(bool, false) QVariant(bool, false)
rotation QVariant(double, 0) QVariant(double, 0)
scale QVariant(double, 1) QVariant(double, 1)
transformOrigin QVariant(int, 4) QVariant(int, 4)
smooth QVariant(bool, true) QVariant(bool, true)
antialiasing QVariant(bool, false) QVariant(bool, false)
implicitWidth QVariant(double, 0) QVariant(double, 0)
implicitHeight QVariant(double, 0) QVariant(double, 0)