QML:计算Y位置时的绑定循环

时间:2019-02-17 15:01:30

标签: qt text qml qt5

这是我的代码:

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本身无关。

1 个答案:

答案 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有所不同。