如何通过字符串ID查找QML项目?

时间:2015-07-03 12:24:13

标签: qt dynamic qml qtquick2

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

var idToFind = "myBtnId"

我可以执行以下操作吗?

var objectThatINeed = myMainWindow.findObjectById(idToFind)

据我所知,我可以将objectName用于此目的(至少从C ++开始)。我可以在不引入名称的情况下以某种方式重用现有的id吗?

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

4 个答案:

答案 0 :(得分:7)

不,你必须使用objectName或其他一些财产。

The id Attribute

  

创建对象实例后,无法更改其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...)

}