2017-09-08 10 views
0

나는 이와 같이 C++ 측에서 QQuickItem을 가져 왔습니다.C++ 측에서 새로운 QQuickItem 복사본을 기존의 것과 동일한 속성으로 만드는 방법

QQuickItem * my_item = qmlEngine->rootObjects()[0]->findChild<QQuickItem*>("ItemObjectName"); 

my_item는 &가에 설정된 모든 속성이 유효합니다.

시나리오
내가 가진 2 창문이 QQuickItem이 alterantively에 그려진해야. 이 창이 다른 창에 my_item으로 렌더링하고 싶습니다. 나는 다른 창

// the_other_window is a QQuickWindow 
QQuickWindow * the_other_window; 

// here I set parent 
my_item->setParentItem(the_other_window->contentItem()); 

my_item의 부모를 설정 이것은이 다시 my_item의 원래 창으로 다시 setParentItem을 나를 필요 그렇지 않으면 원래 창에 보이지 않는가는만큼 완벽하게 잘 작동합니다. 이것은 작동하지만 불필요한 의존성을 제공합니다. 대신 나는 QQuickItem &의 복사본을 만들려고합니다. setParentItem을 수행합니다.

QQuickItem * item_copy = new QQuickItem(my_item); 

질문 : 이런 식으로 복사하여 을 나는 정확히 같은 my_item 등으로 item_copy을 만들고 싶어. QQuickItem은 복사 할 수 없음을 알았습니다. 따라서 my_item의 모든 속성을 item_copy으로 설정하려고합니다. 따라서 처음부터 my_item을 재생성하십시오. 어떻게해야합니까? 어떤 속성을 주로 복사해야합니까? 너비, 높이, x, y & 그 밖의 무엇?

하나씩 복사하지 않고 모든 유효한 속성을이 새로운 속성으로 복사하는 방법이 있습니까?

+1

현재의 양육 솔루션은 의미가? http://doc.qt.io/qt-5/qtquick-visualcanvas-visualparent.html – ManuelH

답변

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) 
+0

fantastic. 덕분에 많이 –

+0

복사본이 잘 작동합니다. 나는 그 대답을 받아 들였다. 그러나'item_copy'에'setParentItem'을 실행하면 두 번째 창에 표시되지 않습니다. 별도의 문제 일 수 있습니다. 'item_copy-> setVisible (true)'를 호출하려고했습니다. 두 번째 창에 'item_copy'가 나타나지 않습니다. 이것에 대한 어떤 제안이라도? –