Делаю я тип 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/1286422/qml_trouble_function.pngПочему же, например, 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/1286422/scr0055.jpgТо есть, если вычислить выражение в отладчике, оно дает ненулевое значение. То же самое выражение, присвоенное свойству scaleFactor, имеет значение 0.
Почему так?