LINUX.ORG.RU

Связывание свойств в QML: почему не работает?

 , , ,


0

1

Делаю я сейчас самодельный тип для отображения компаса. Компас состоит из корпуса и стрелки. Для корпуса и стрелки подготовлены 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
    }
}

★★★★★
Ответ на: комментарий от fluorite

Честно говоря, я вообще хотел обойтись бы без JavaScript биндинга, вот так:

    property int elementScale: sourceSize.width/width

    Image {
        id: arrow
        source: "qrc:/resource/pic/compassIndicator/arrow.png"
        scale: compassCase.elementScale
    }

Но так масштаб у стрелки всегда равен 1. Не пойму почему.

Xintrea ★★★★★
() автор топика

width: parent.width*0.8
height: parent.height*0.8

Совет, старайся использовать якорение к краям с отступами. У них в кишках на это оптимизации есть.

ya-betmen ★★★★★
()
Ответ на: комментарий от Xintrea

Ну в данном конкретном случае может и не стоит, но просто плохая привычка. В свое время пришлось возится с вычищением тормозов на всякой подобной мелочи.

На всякий случай у культей на сайте есть гайды по этому делу.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.