Qt 如何通过其字符串id查找QML项?

Qt 如何通过其字符串id查找QML项?,qt,dynamic,qml,qtquick2,Qt,Dynamic,Qml,Qtquick2,我需要在QML树中找到一个对象的字符串id。 例如: var idToFind = "myBtnId" 我能做如下的事情吗 var objectThatINeed = myMainWindow.findObjectById(idToFind) 据我所知,我可以为此使用objectName(至少从C++)。我是否可以在不引入名称的情况下以某种方式重用现有的ids 我想将此对象用作其他一些动态创建控件的父对象。否,您必须使用objectName或其他一些属性 : 创建对象实例后,无法更改其id属

我需要在QML树中找到一个对象的字符串
id
。 例如:

var idToFind = "myBtnId"
我能做如下的事情吗

var objectThatINeed = myMainWindow.findObjectById(idToFind)
据我所知,我可以为此使用
objectName
(至少从C++)。我是否可以在不引入名称的情况下以某种方式重用现有的
id
s


我想将此对象用作其他一些动态创建控件的父对象。

否,您必须使用
objectName
或其他一些属性

:

创建对象实例后,无法更改其id属性的值。虽然它可能看起来像一个普通属性,但id属性不是一个普通属性属性,并应用特殊的语义例如,在上述示例中,无法访问myTextInput.id

QJSValue MyEngine::getQmlObjectById(const QString&id){
QV4::ExecutionEngine*v4=QV8Engine::getV4(m_JSEngine);
范围(const_cast(v4));
范围字符串名称(范围,v4->newString(id));
返回QJSValue(v4,v4->currentContext->getProperty(name));
}

如果您事先知道需要的所有项目的ID,您可以为它们创建一个对象映射,并使用它来查找它们。例如:

var idToFind = "myBtnId"
项目{
属性变量idMap:({foo:foo,bar:bar})
矩形{id:foo}
项目{id:bar}
函数findItemById(id){
返回idMap[id];
}
Component.onCompleted:console.log(findItemById('foo')、findItemById('bar'))
//qml:QQuickRectangle(0x1479e40)QQuickItem(0x148fbf0)
}

根据Phrogz的答案,如果不需要显式映射,可以将组件指定给属性,然后使用[]运算符引用这些属性:

Item {
    id: page
    property Component foo: Rectangle { color: "yellow" }
    property Component bar: Item {  }

    Component.onCompleted: console.log(page["foo"], page["bar"])
    //qml: QQuickRectangle(0x...) QQuickItem(0x...)

} 

C++不能从其代码> ID < /代码>中引用对象。它不是常规属性,您无法更改它,并且
id
仅存在于QML范围中。但是您可以轻松地使用
objectName
而不是@Miki注意到的
id