2015-07-03 39 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) 
}