Делаю я сейчас самодельный тип для отображения компаса. Компас состоит из корпуса и стрелки. Для корпуса и стрелки подготовлены PNG-рисунки.
Размер корпуса на экране зависит от размера области, в которую он вставляется (кстати, эта область гарантированно квадратная):
Image {
id: compassCase
width: parent.width*0.8
height: parent.height*0.8
source: "qrc:/resource/pic/compassIndicator/compassCase.png"
Таким образом, корпус компаса приобретает некий масштаб. И его нужно использовать при отрисовке стрелки, чтобы масштаб стрелки соответствовал масштабу компаса. Для вычисления и запоминания масштаба я создаю свойство elementScale:
property int elementScale: mathScale(sourceSize.width, width)
...
function mathScale( sourceWidth, screenWidth ) {
var scale=screenWidth/sourceWidth
console.log("Compass scale "+scale);
return scale
}
В логе я вижу такие значения:
qml: Compass scale NaN
qml: Compass scale NaN
qml: Compass scale 0
qml: Compass scale 0.617611580217129
И это свойство я пытаюсь применить к стрелке:
Image {
id: arrow
source: "qrc:/resource/pic/compassIndicator/arrow.png"
scale: compassCase.elementScale
}
Но оно, как я выяснил, на момент использования содержит нуливое значение, и стрелка приобретает нуливой масштаб и становится нуливого размера. А выяснил я это так:
scale: printScale(compassCase.elementScale)
...
function printScale( scale ) {
console.log("Arrow scale "+scale);
return scale
}
А в логе получается вот такое:
qml: Compass scale NaN
qml: Arrow scale -2147483648
qml: Compass scale NaN
qml: Compass scale 0
qml: Arrow scale 0
qml: Compass scale 0.617611580217129
Я не понимаю, почему после последнего изменения масштаба компаса (значение 0.61) не пересчитывается значение масштаба для стрелки? Ведь на эти значения (compassCase.elementScale и scale для arrow) вроде как распространяется связывание свойств (property binding)?
Вот, для понимания, весь код:
Image {
id: compassCase
width: parent.width*0.8
height: parent.height*0.8
source: "qrc:/resource/pic/compassIndicator/compassCase.png"
// Масштаб для всех подчиненных элементов, на основе масштаба корпуса компаса
property int elementScale: mathScale(sourceSize.width, width)
Image {
id: arrow
source: "qrc:/resource/pic/compassIndicator/arrow.png"
scale: printScale(compassCase.elementScale)
}
function mathScale( sourceWidth, screenWidth ) {
var scale=screenWidth/sourceWidth
console.log("Compass scale "+scale);
return scale
}
function printScale( scale ) {
console.log("Arrow scale "+scale);
return scale
}
}