2016-04-20 3 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. 
     } 
    } 
} 

Я хочу знать:QML: Не удается прочитать свойство «ххх» неопределенной

  1. Почему это не работает, когда я добавить корневой идентификатор в выше комментировал линии?

  2. Как дочерний компонент доступа к компоненту компонента дочернего компонента, если компонент для детей создается из файла XXX.qml?

ответ

2

id свойства является «особым видом» имущества, он разрешен только «время коды» и не может быть решен во время выполнения.

root.watchLcd не будет работать, потому что watchLcd является id, и как таковой он не может быть решен с 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 работы - это может быть полезно во многих случаях, если все, что вам нужно, чтобы получить доступ является собственностью вложенного объекта вы можете выставить его с псевдонимом без необходимости доступа к объекту извне.

Смежные вопросы