我有一个我需要在QML树中找到的对象的字符串id
。
例如:
var idToFind = "myBtnId"
我可以执行以下操作吗?
var objectThatINeed = myMainWindow.findObjectById(idToFind)
据我所知,我可以将objectName
用于此目的(至少从C ++开始)。我可以在不引入名称的情况下以某种方式重用现有的id
吗?
我想将此对象用作其他动态创建控件的父对象。
答案 0 :(得分:7)
不,你必须使用objectName
或其他一些财产。
创建对象实例后,无法更改其id属性的值。虽然它看起来像普通的属性,但id属性不是普通的属性属性,并且特殊的语义适用于它; 例如,在上例中无法访问myTextInput.id。
答案 1 :(得分:2)
如果您事先知道所需项目的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)
}
答案 2 :(得分: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));
}
答案 3 :(得分:0)
基于 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...)
}