2015-07-03 38 views
2

我有一個字符串id我需要在QML樹中找到的對象。 例如:如何通過字符串ID查找QML項目?

var idToFind = "myBtnId" 

我可以做類似以下的事嗎?

var objectThatINeed = myMainWindow.findObjectById(idToFind) 

據我明白我可以使用objectName用於此目的(至少從C++)。我是否仍然可以重複使用現有的id s而不用引入名稱?

我想將此對象用作其他一些動態創建控件的父項。

+0

看一看這樣的:https://supportforums.blackberry.com/t5/Native-Development/getElementById-in-qml/mp/2378177#M22466 – Miki

+1

你不能指通過反對其來自C++的'id'。它不是普通的屬性,你不能改變它,'id'只存在於QML範圍內。但@Miki注意到你可以使用'objectName'而不是'id'。 – folibis

回答

6

不,您必須使用objectName或其他一些屬性。

The id Attribute

一旦對象實例被創建,它的id屬性的值不能被改變。儘管它看起來像一個普通的屬性,但id屬性不是一個普通的屬性屬性,特殊的語義適用於它;例如,,在上面的示例中無法訪問myTextInput.id。

1
QJSValue MyEngine::getQmlObjectById(const QString& id) { 
    QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_JSEngine); 
    QV4::Scope scope(const_cast<QV4::ExecutionEngine *>(v4)); 
    QV4::ScopedString name(scope, v4->newString(id)); 
    return QJSValue(v4, v4->currentContext->getProperty(name)); 
} 
1

如果你知道你要事先所有物品的ID,您可以爲他們創建一個對象圖,用它來看看他們。例如:

Item { 
    property var idMap: ({ foo:foo, bar:bar }) 
    Rectangle { id:foo } 
    Item { id:bar } 

    function findItemById(id) { 
     return idMap[id]; 
    } 

    Component.onCompleted: console.log(findItemById('foo'), findItemById('bar')) 
    // qml: QQuickRectangle(0x1479e40) QQuickItem(0x148fbf0) 
}