2016-04-20 226 views
2
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. 
     } 
    } 
} 

“XXX”我想知道:QML:无法读取属性未定义

  1. 为什么当我在上面的注释行加根ID它不工作?

  2. 如果从XXX.qml文件创建子组件,子组件的访问同级组件的属性如何实现?

回答

2

id属性是一个“特殊的”财产,它只是解决了在“代码时间”,并在运行时不能得到解决。

root.watchLcd不会起作用,因为watchLcdid,因此它不能与root.watchLcd

id也在逻辑只适用于特定的源来解决,而你只需要特定id不管对象树的结构,如果你想从另一个文件访问某个特定的对象,你不需要它的父id作为root.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作品 - 这可能是在许多情况下是有用的,如果你需要的访问是一个嵌套对象的属性,您可以将其暴露具有别名而不需要从外部访问该对象。

相关问题