【问题标题】:Load many font variations in QML在 QML 中加载许多字体变体
【发布时间】:2016-09-25 00:34:27
【问题描述】:

我有一个 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 }

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

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 }

我对此感到惊讶。尽管在任何FontLoader 中从未提及这些文件,但它肯定似乎使用EncodeSans-Thin.ttf 来表示细重,EncodeSans-Bold.ttf 表示粗体。

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

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

【问题讨论】:

  • 还是只用 C++ 做? QDirIterator it(":/fonts/*.ttf"); while (it.hasNext()) QFontDatabase::addApplicationFont(it.next());
  • @peppe 感谢您的代码,这可能会有所帮助。不过,我更愿意坚持使用纯 QML。
  • 正如您在我对其他 qml 字体相关问题的回答中看到的那样,我会说上述建议是一种可行的方法,所以不幸的是,在大多数情况下纯 QML 字体支持是无法解决的痛苦......
  • @Phrogz:我现在也是这样,你用 QML 解决了吗?
  • @Phataas 我只是在我的项目中添加了 45 个 FontLoader 实例,每个 TTF 一个。

标签: qt fonts qml


【解决方案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] })
        }
    }
}

edit:给定字符串和 URL 列表,您可以使用中继器来加载许多字体。 Component.onCompleted:脚本读取要从中加载字体的 URL 列表,并将它们全部添加到列表中。由于转发器模型是 ListModel,因此转发器将在添加到 ListModel 时创建新项目。中继器也可以通过这种方式重新定位,但此处未使用。 注意:这个sn-p中没有给出加载URL列表。

【讨论】:

  • 请解释这段代码如何回答 OP 的问题:“我应该为我的项目添加 45 个 FontLoader,每个 TTF 一个吗?或者有没有办法让所有的 TTF无需 FontLoader 即可加载?”。请尽量避免仅仅将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。请编辑您的答案以包含clarification, context and try to mention any limitations, assumptions or simplifications in your answer.
  • 在 FontLoader 中,source: model.source 来自哪里?我正在尝试参考 QML 文档来理解它,但我在任何地方都没有看到模型上提到的这个 source 属性。
猜你喜欢
  • 2013-02-09
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
相关资源
最近更新 更多