LINUX.ORG.RU

Почему-то не вычисляется выражение в QML (с картинками)

 , , ,


0

1

Делаю я тип MetallFramePlanarButton.qml для отрисовки кнопки. Делается на базе типа Item. Предполагается, что кнопка квадратная. В нем сделано свойство scaleFactor (используемое для масштабирования внутренних элементов):

Item {
    id: root
    
    ...

    property double scaleFactor: buttonFrame.implicitWidth===0 ? 0 : root.width/buttonFrame.implicitWidth

    // Размер кнопки задается шириной. Кнопка квадратная
    height: root.width

    onWidthChanged: {
        setButtonFrameSize();
    }

    onHeightChanged: {
        setButtonFrameSize();
    }

    // * Установка размера картинки рамки *
    function setButtonFrameSize() {
        // Напрямую устанавливать значения нельзя
        var w=buttonFrame.implicitWidth*root.scaleFactor;
        var h=buttonFrame.implicitHeight*root.scaleFactor;

        buttonFrame.width=w;
        buttonFrame.height=h;
    }

    ... 

    // Металлическая рамка
    // Относительно нее считаются размеры и смещения всех остальных элементов в кнопке
    Image {
        id: buttonFrame

        source: "qrc:/resource/pic/button/metallFramePlanarButton/buttonCase.png"
        fillMode: Image.PreserveAspectFit
    }

}

Используется эта кнопка с указанием ширины:
MetallFramePlanarButton {
        id: exitToMainMenuButton

        iconSource1: "qrc:/resource/pic/mapTools/buttons/iconMenu.png"

        width: root.buttonSize
    }

Так вот, ставлю я брекпоинт в функцию setButtonFrameSize(), чтобы посмотреть как вычисляются w и h. И вижу, что они равны нулю:

http://i.piccy.info/i9/2094984c903235facac02d77768cd2b3/1543847738/275438/128...

Почему же, например, w равно нулю? Потому что:

buttonFrame.implicitWidth = 169
root.scaleFactor = 0

Умножение на 0 дает 0. Теперь вопрос, а почему root.scaleFactor нуливой? Дублирую выражение, которым это свойство вычисляется, чтобы оно вычислилось в отладчике (его видно справа вверху, нижняя строчка:
buttonFrame.implicitWidth===0 ? 0 : root.width/buttonFrame.implicitWidth

И это выражение дает значение 0.53. Это совсем не 0!

http://i.piccy.info/i9/1bf478f285b85c332fa833252893bd8b/1543853567/207581/128...

То есть, если вычислить выражение в отладчике, оно дает ненулевое значение. То же самое выражение, присвоенное свойству scaleFactor, имеет значение 0.

Почему так?

★★★★★

Я ничего не понимаю в QML, но может быть, у тебя получилось целочисленное деление? Можешь преобразовать root.width в double в операции деления?

cdslow ()
Ответ на: комментарий от cdslow

Нет, ведь точно такое же выражение дает результат с плавающей точкой.

Там реально тупит движок QML, я смог сделать простой код, который демонстрирует похожую проблему:

Тупит QML на примитивном коде - что ему еще надо? (С видео)

Xintrea ★★★★★ ()