我有一個字符串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