Tome este código:QML rompecabezas alcance componente
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 }
}
}
¿Por qué se hace exactamente la Gradient
recoger sus propiedades fromColor
y toColor
del elemento envolvente?
¿Dónde está esto documentado (al menos dentro de los comentarios del código fuente, mejor dentro de los documentos oficiales)?
Nota: este "ejemplo ofuscación QML es de charla de Girish Ramakrishnan Qt Quick Best Practices and Design Patterns (rebobinar a 25 minutos), donde él dice que la cosa es muy complicada y tiene que con el alcance de los componentes y de esa manera, pero no tiene tiempo para explicar por qué.
[ACTUALIZACIÓN]
Así que, como MartinJ dice a continuación, el componente de nivel superior en el elemento de propiedad (no único elemento hijo) jerarquía tiene sus propiedades visibles a todas las propiedades sin embargo profundo anidado, con la precedencia de las propiedades de esas propiedades, y todos los pr operties de elementos "intermedios" no vistos en absoluto.
Aquí hay un pequeño ejemplo:
import QtQuick 1.1
Item {
Item {
property string s: "parent-str"
Item { Component.onCompleted: console.log(s) }
}
}
Esto da: "ReferenceError: Can't find variable: s"
Y esto funciona como se esperaba:
import QtQuick 1.1
Item {
property string s: "parent-str"
Item { Component.onCompleted: console.log(s) }
}
, la salida "parent-str"
.
Por favor, vea los comentarios de MartinJ a continuación.
"si usted está interesado en saber por qué es como es ... simplemente no dude en tomar después de la charla. " (Girish Ramakrishnan en esa charla). Bueno, ratas. – cgmb
@ Slavik81 Bueno, el simple hecho de señalar el tema fue muy útil, al menos. Además, siempre podemos enviarle un correo electrónico, si él no ha olvidado los detalles relevantes :) – mlvljr
@ Slavik81 Se borró, respondió Martin, y actualicé mi pregunta con un (espero) ejemplo aclaratorio. – mlvljr