Головоломка области видимости компонента QML

Возьмите этот код:

import QtQuick 1.1

Rectangle {
    width:  100
    height: 100

    property color fromColor: "red"
    property color toColor:   "blue"

    gradient: Gradient {
        property color fromColor: "yellow"
        property color toColor:   "green"

        GradientStop { position: 0; color: fromColor }
        GradientStop { position: 1; color: toColor }
    }
}

Почему именно Gradientвыбирает свои свойства fromColorи toColorиз окружающего элемента?

Где это задокументировано (хотя бы в комментариях к исходному коду, а лучше в официальной документации )?

Обратите внимание :этот «пример обфускации QML взят из доклада Гириша Рамакришнана Qt Quick Best Practices and Design Patterns(перемотать на 25-ю минуту ), где он действительно говорит, что дело чрезвычайно сложное и должно иметь объем компонентов и тому подобное, но не имеет времени объяснять, почему.

[ОБНОВЛЕНИЕ]

Итак, как сообщает MartinJ ниже, компонент верхнего -уровня в элементе -свойство (не только элемент -дочерний )иерархии имеет свои свойства, видимые для всех свойств, однако глубоко вложенных, с приоритетом свойств этих свойств, а все свойства «промежуточных» элементов вообще не видны.

Вот небольшой пример:

import QtQuick 1.1

Item {
    Item {
        property string s: "parent-str"
        Item { Component.onCompleted: console.log(s) }
    }
}

Это дает:"ReferenceError: Can't find variable: s"

И это работает, как и ожидалось:

import QtQuick 1.1

Item {
    property string s: "parent-str"
    Item { Component.onCompleted: console.log(s) }
}

, вывод "parent-str".

См. комментарии MartinJ ниже.

10
задан mlvljr 9 July 2012 в 14:36
поделиться