我从c 侧获取了一个QQuickItem
。
QQuickItem * my_item = qmlEngine->rootObjects()[0]->findChild<QQuickItem*>("ItemObjectName");
my_item
有效&amp;将所有属性设置在其上。
方案
我有 2个Windows ,需要在更改上绘制此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
&amp;对此进行setParentItem
。通过这样的复制:
QQuickItem * item_copy = new QQuickItem(my_item);
问题:我想使item_copy
与my_item
完全相同。我了解到QQuickItem
不可复制。因此,要将my_item
的所有属性设置为item_copy
。因此从头开始重新创建my_item
。我怎样才能做到这一点?我应该主要复制哪些属性?宽度,高度,x,y&amp;还有什么?
是否有一种方法将所有有效属性复制到本新属性的情况下,而无需一个一个地复制每个有效属性?
要复制您必须使用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)