Головоломка области видимости компонента 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
свойства из вмещающего элемента?
Где это задокументировано (по крайней мере, в комментариях к исходному коду, лучше в официальных документах)?
Note: this "QML obfuscation example is from Girish Ramakrishnan's talk Qt Quick Best Practices и Шаблоны проектирования (перемотка к 25-й минуте), где он говорит, что вещь чрезвычайно сложная и имеет отношение к области действия компонентов и тому подобное, но не имеет времени объяснить, почему.
[UPDATE]
Таким образом, как говорит MartinJ ниже, компонент верхнего уровня в иерархии element-property (не только element-child) имеет свои свойства, видимые для всех свойств, сколь бы глубокими они ни были, с приоритетом этих свойств & apos; свойства и все свойства "промежуточного" предметы не видны вообще.
Вот небольшой пример:
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 ниже.