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

时间:2016-04-20 07:21:32

标签: qt qml qtquick2 qt-quick

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文件创建子组件,子组件如何访问兄弟组件的属性?

1 个答案:

答案 0 :(得分:3)

id属性是属性的“特殊类型”,它仅在“代码时间”解析,在运行时无法解析。

root.watchLcd无法使用,因为watchLcdid,因此无法使用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如何工作 - 在许多情况下它可能很有用,如果您需要访问的是嵌套对象的属性,则可以使用别名公开它,而无需在外部访问该对象。 / p>