在QML

时间:2016-05-26 20:32:22

标签: qt fonts qml

我有一个QtQuick / QML 5.6项目,我需要加载45个.ttf文件,代表不同(相关)字体系列的重量变化。

例如,这里是字体文件的子集(两个系列的三个权重):

  • EncodeSans-Thin.ttf
  • EncodeSans-Regular.ttf
  • EncodeSans-Bold.ttf
  • EncodeSansNarrow-Thin.ttf
  • EncodeSansNarrow-Regular.ttf
  • EncodeSansNarrow-Bold.ttf

我已将所有45个.ttf文件添加到项目中的.qrc,但是当我尝试使用字体系列时,它不起作用:

Text { text:"So Thin"; font.family:"Encode Sans"; font.weight:Font.Thin }
Text { text:"Fatty";   font.family:"Encode Sans"; font.weight:Font.Bold }

如果我为每个系列中的一种字体添加一个单个字体加载器,那么它适用于该字体的所有重量变化

FontLoader { source:"qrc:/fonts/EncodeSans-Regular.ttf" }
FontLoader { source:"qrc:/fonts/EncodeSansNarrow-Regular.ttf" }
Text { text:"So Thin"; font.family:"Encode Sans"; font.weight:Font.Thin }
Text { text:"Fatty";   font.family:"Encode Sans"; font.weight:Font.Bold }

我对此感到惊讶。尽管从未在任何EncodeSans-Thin.ttf中提及过这些文件,但它确实似乎使用EncodeSans-Bold.ttf表示较轻的权重而FontLoader表示粗体重。

编辑:上面的代码不起作用。由于单独的错误,我现在知道Font.Thin从未工作(显示常规权重),并且文本渲染器可能会模拟粗体。

我应该在项目中添加45 FontLoader,每个TTF一个吗?或者有没有办法让所有的TTF加载而不需要FontLoader

1 个答案:

答案 0 :(得分:1)

Repeater {
    id: repeater
    property var fontList: [] // e.g. Qt.resolvedUrl("qrc:///fonts/EncodeSans-Regular.ttf"), or load a list from resource/config files
    model: ListModel {
        id: listModel
    }
    FontLoader {
        source: model.source
    }
    Component.onCompleted: {
        for (var i = 0; i < fontList.length; i++) {
            listModel.append({ source: fontList[i] })
        }
    }
}

编辑:给定字符串和URL列表,您可以使用转发器加载许多字体。 Component.onCompleted:脚本读取URLS列表以从中加载字体,并将所有这些字体添加到列表中。由于转发器模型是ListModel,因此转发器在添加到ListModel时将创建新项目。这种方式也可以重新定位转发器,但这里不再使用。 注意:此代码段中未提供加载URL列表。