我有一个字符串id
我需要在QML树中找到的对象。 例如:如何通过字符串ID查找QML项目?
var idToFind = "myBtnId"
我可以做类似以下的事吗?
var objectThatINeed = myMainWindow.findObjectById(idToFind)
据我明白我可以使用objectName
用于此目的(至少从C++)。我是否仍然可以重复使用现有的id
s而不用引入名称?
我想将此对象用作其他一些动态创建控件的父项。
我有一个字符串id
我需要在QML树中找到的对象。 例如:如何通过字符串ID查找QML项目?
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);
QV4::Scope scope(const_cast<QV4::ExecutionEngine *>(v4));
QV4::ScopedString name(scope, v4->newString(id));
return QJSValue(v4, v4->currentContext->getProperty(name));
}
如果你知道你要事先所有物品的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)
}
看一看这样的:https://supportforums.blackberry.com/t5/Native-Development/getElementById-in-qml/mp/2378177#M22466 – Miki
你不能指通过反对其来自C++的'id'。它不是普通的属性,你不能改变它,'id'只存在于QML范围内。但@Miki注意到你可以使用'objectName'而不是'id'。 – folibis