2016-04-20 328 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作品 - 這可能是在許多情況下是有用的,如果你需要的訪問是一個嵌套對象的屬性,您可以將其暴露具有別名而不需要從外部訪問該對象。

相關問題