QML:无法读取未定义的 属性 'xxx'

QML: Cannot read property 'xxx' of undefined

ApplicationWindow {
    id: root

    property string rootName: "--rootName"

    visible: true
    width: 800
    height: 400

    title: qsTr("WatchFace Maker")

    WatchLcd{
        property string watchLcdInApp: "watchLcdInApp"
        id: watchLcd
    }

    TextAdder{
        id: textAdder

        Component.onCompleted: {
            console.log("APP: ", root.watchLcd.watchLcdInApp)//#Error!!! remove root, it works.
        }
    }
}

我想知道:

  1. 为什么我在上面的注释行中添加 root id 时不起作用?

  2. 如果子组件是从 XXX.qml 文件创建的,子组件如何访问兄弟组件的 属性?

id属性是属性的"special kind",只在"code time"解析,运行时无法解析。

root.watchLcd 将不起作用,因为 watchLcd 是一个 id,因此无法用 root.watchLcd

解析

id 在逻辑上也只在那个特定的源中工作,你只需要那个特定的 id 而不管对象树的结构,你不需要它的父 idroot.watchLcd

如果你想从另一个文件访问一个特定的对象,自然地,这不能通过它的 id 发生。您可以使用 属性 或函数:

//SomeItem.qml
Item {
  property alias text : obj.text
  Item  {
    id: obj
    property string text
  }
  property Item object : obj
  function getObj() { return obj }
}

/main.qml
Window {
  visible: true

  SomeItem {
    id: item
    text: "someText"
  }

  SomeItem {
    Component.onCompleted: {
      //console.log(item.obj.text) // TypeError: Cannot read property 'text' of undefined
      console.log(item.object.text) // someText
      console.log(item.getObj().text) // someText
    }
  }
}

此外,请注意 property alias 的工作原理 - 它在许多情况下可能很有用,如果您需要访问的只是一个嵌套对象的 属性,您可以使用别名公开它而无需访问到外部对象。