Qml Qt快速控制2:缩放字体大小而不绑定循环

时间:2017-04-06 05:50:01

标签: qt qml qtquickcontrols2

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

Label {
    font.size: font.size*0.8
}

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

Label {
    id: hiddenLabel
}

Label {
    font.size: hiddenLabel.font.size*0.8
}

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

Label {
    scale: 0.8
}

此致

4 个答案:

答案 0 :(得分:7)

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

Label {
    font.pixelSize: Qt.application.font.pixelSize * 0.8
}
  

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

commit message for the change提及当时考虑的其他选项:

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

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

Button {
    id: dummyButton
}

Button {
    font.pixelSize: dummyButton.font.pixelSize * 0.8
}

这是因为每种样式对于不同类型的控件具有不同的字体大小。例如,请参阅Material style's theme code

答案 1 :(得分:1)

您可以通过在Component.onCompleted

中设置fontsize来使用赋值而不是绑定
Label {
    text: 'Þetta reddast'
    Component.onCompleted: font.pixelSize *= 0.8
}

这会产生负面影响,即文本布局两次:一次是较大尺寸,另一次是较小尺寸。

我可以在fonts中定义一组style.qml singleton ExpenseDTO expenseDTO = new ExpenseDTO(); 作为proposed here。在那里,您可以使用应用程序默认字体指标初始计算相对大小,因此您不必再费心。

答案 2 :(得分:0)

FontMetrics {
    id: fontMetrics
}

Label {
    font.size: fontMetrics.font.size * 0.8
}

答案 3 :(得分:0)

我建议在main.qml中定义一个全局属性,而不是在每个元素中分别定义文本大小。
为此,在main.qml中定义一个属性,如下所示:

readonly property Item fontCenter: Item {
    property real heading1PointSize: 21
    property real heading2PointSize: 18
    property real bodyPointSize: 12
}

并以此在任何地方使用它:

Text {
    text: "sample body text"
    font { pointSize: fontCenter.bodyPointSize }
}

如果您有任何疑问,也可以基于另一个设置属性值:

readonly property Item fontCenter: Item {
    property real bodyPointSize: 12
    property real heading1PointSize: bodyPointSize * 2.0
    property real heading2PointSize: bodyPointSize * 1.8
}

或用于特殊情况,如下:

Button {
    text: "Special Offer!"
    font { pointSize: fontCenter.bodyPointSize * 1.3 }
}