簡體   English   中英

如何在C ++方面從頭開始創建新的QQuickItem副本,並具有與現有副本相同的屬性

[英]How to create a new QQuickItem copy from scratch on C++ side with the same properties as an existing one

我有一個像這樣從C ++端獲取的QQuickItem

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

my_item有效且已設置所有屬性。

腳本
我有2個需要QQuickItem繪制此QQuickItem 窗口 我想將此my_item渲染到另一個窗口。 只要我將my_item的Parent設置到另一個窗口,這就可以很好地工作

// 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的副本並在QQuickItem執行setParentItem 通過這樣復制:

QQuickItem * item_copy = new QQuickItem(my_item);

問:我想使item_copy作為完全一樣my_item 我了解到QQuickItem是不可復制的。 因此,要將my_item所有屬性設置為item_copy 因此從頭開始重新創建my_item 我怎樣才能做到這一點? 我應該主要復制哪些屬性? 寬度,高度,x,y和其他什么?

有沒有一種方法可以將所有有效屬性復制到此新屬性中,而不必一個一個地復制每個屬性?

要復制所有屬性,您必須使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM