这是我的代码:
FontLoader { id: font_bold; source: "qrc:/font/MyFont Bold.ttf" }
FontLoader { id: font_medium; source: "qrc:/font/MyFont Medium.ttf" }
FontMetrics { id: fontMetrics }
function getBaseline(fontFamily, fontPixelSize)
{
fontMetrics.font.family = fontFamily;
fontMetrics.font.pixelSize = fontPixelSize;
return fontMetrics.ascent;
}
function getY(desiredY, fontFamily, fontPixelSize)
{
return desiredY - getBaseline(fontFamily, fontPixelSize);
}
Text {
x: 100
y: getY(100, font.family, font.pixelSize)
font.family: font_bold.name
font.pixelSize: 96
text: "foo"
}
Text {
x: 200
y: getY(150, font.family, font.pixelSize)
font.family: font_medium.name
font.pixelSize: 48
text: "foo"
}
目标是从所需位置计算实际的y
位置,并删除当前字体的上升偏移量,因此基线将位于所需位置。
我在两行y: getY(...)
上都遇到此错误:
QML QQuickText:检测到属性“ y”的绑定循环
我看不到绑定循环在哪里。 y
属性是根据所需位置计算的-字体上升。两者都与y
本身无关。
答案 0 :(得分:2)
这是因为您同时对两种字体都使用了FontMetrics
,所以不断地改变了上升方式。请记住,您正在将函数绑定到y位置,因此,每次将FontMetrics
设置为另一种字体时,都会触发两个Text
的y位置的更新。
因此,我建议使用两个FontMetrics
,一个用于粗体,另一个用于介质。
FontMetrics { id: fontMetricsBold; font: font_bold }
FontMetrics { id: fontMetricsMedium; font: font_medium }
Text {
x: 100
y: 100 - fontMetricsBold.ascent
font.family: font_bold.name
font.pixelSize: 96
text: "foo"
}
Text {
x: 200
y: 150 - fontMetricsMedium.ascent
font.family: font_medium.name
font.pixelSize: 48
text: "bar"
}
注意,我没有字体,所以我将其保留为练习。也许FontMetrics
的配置必须与FontLoader
有所不同。