Russian Qt Forum
Апрель 23, 2024, 15:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Связывание свойств в QML: почему не работает?  (Прочитано 3275 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 18, 2018, 13:42 »

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

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Январь 23, 2018, 13:45 »

Отвечаю сам себе. Оказывается, механизм property binding не распространяется на свойства, которые получают свои значения из JavaScript функций. Для того, чтобы заработал property binding, надо обернуть JavScript-функцию конструкцией Qt.binding( ... ), как на примере:

Код:
Keys.onSpacePressed: {
        height = Qt.binding(function() { return width * 3 })
    }

Здесь видно, что оборачивается безымянная функция, которая прописана прямо на месте своего использования.

Как обернуть именованную функцию, в документации не сказано, надо разбираться дальше.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.042 секунд. Запросов: 22.