Qt QML:无法读取属性';xxx和x27;未定义的

Qt QML:无法读取属性';xxx和x27;未定义的,qt,qml,qtquick2,qt-quick,Qt,Qml,Qtquick2,Qt Quick,我想知道: 为什么在上面的注释行中添加根id时它不起作用 如果子组件是从XXX.qml文件创建的,子组件如何访问同级组件的属性 id属性是一种“特殊类型”的属性,它只在“代码时间”解析,不能在运行时解析 root.watchLcd将无法工作,因为watchLcd是一个id,因此无法使用root.watchLcd id在逻辑上也仅在该特定源中工作,并且您只需要该特定的id无论对象树的结构如何,都不需要它的父id,如root.watchLcd 如果您想从另一个文件访问特定对象,自然不能通过其id实现

我想知道:

  • 为什么在上面的注释行中添加根id时它不起作用

  • 如果子组件是从XXX.qml文件创建的,子组件如何访问同级组件的属性


  • id
    属性是一种“特殊类型”的属性,它只在“代码时间”解析,不能在运行时解析

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

    id
    在逻辑上也仅在该特定源中工作,并且您只需要该特定的
    id
    无论对象树的结构如何,都不需要它的父
    id
    ,如
    root.watchLcd

    如果您想从另一个文件访问特定对象,自然不能通过其
    id
    实现。您可以为其使用属性或函数:

    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.
            }
        }
    }
    
    另外,请注意
    属性别名的工作原理-它在许多情况下可能很有用,如果您只需要访问嵌套对象的属性,则可以使用别名将其公开,而无需从外部访问该对象

    //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
        }
      }
    }