Qml Qt Quick Control 2:缩放字体大小,不带绑定循环

Hyn*_*rix 0 qt qml qtquickcontrols2

我想缩放Label像这样的字体大小:

Label {
    font.size: font.size*0.8
}
Run Code Online (Sandbox Code Playgroud)

当然这会创建一个绑定循环.有没有办法在不创建隐藏Label元素的情况下执行此操作?

Label {
    id: hiddenLabel
}

Label {
    font.size: hiddenLabel.font.size*0.8
}
Run Code Online (Sandbox Code Playgroud)

缩放整个标签不是最佳的,因为文本质量下降:

Label {
    scale: 0.8
}
Run Code Online (Sandbox Code Playgroud)

问候,

Mit*_*tch 8

除了已经提到的其他选项,还有Qt.application.font:

Label {
    font.pixelSize: Qt.application.font.pixelSize * 0.8
}
Run Code Online (Sandbox Code Playgroud)

此只读属性包含返回的默认应用程序字体QGuiApplication::font().

更改提交消息提到了当时考虑的其他选项:

  • " <h3>Large text</h3>" - 在文本下面增加了额外的空间,因为它是一个HTML元素,所以如果你想要一个体面的布局,那就没有用了.
  • 硬编码像素大小.与Qt :: AA_EnableHighDpiScaling结合使用时工作正常,只要您猜测适用于您所定位的每个设备/显示器的正确尺寸.没有设置Qt :: AA_EnableHighDpiScaling不起作用.
  • 使用FontMetrics/TextMetrics.工作正常,但有点冗长.
  • 使用空的Text元素.创建一个不必要的项目.已被FontMetrics/TextMetrics取代.
  • defaultPixelSize/implicitPixelSize和defaultPointSize/implicitPointSize.在字体分组属性之外已经存在与字体相关的属性,因此这不会不合适,但API已经非常大.

如果您确实需要将字体大小基于您正在使用的特定控件,唯一可靠的方法是创建该控件的"空"/"默认构造"实例:

Button {
    id: dummyButton
}

Button {
    font.pixelSize: dummyButton.font.pixelSize * 0.8
}
Run Code Online (Sandbox Code Playgroud)

这是因为每种样式对于不同类型的控件具有不同的字体大小.例如,请参阅材质样式的主题代码.