如何加载同一系列的多种字体

How to load multiple font of same familiy

我正在使用 Qt 框架编写应用程序。在显示中,我要显示多个信息,但使用同一家族的不同类型的字体,Montserrat。

到目前为止我为加载字体所做的是:

int ultralightid = QFontDatabase::addApplicationFont(":/Montserrat_UltraLight.tff");
QString UltraFont= QFontDatabase::applicationFontFamilies(ultralightid ).at(0);
QFont font1(UltraFont,QFont::Normal);
font1.setPixelSize(50);

int lightid = QFontDatabase::addApplicationFont(":/Montserrat_Light.tff");
QString LightFont= QFontDatabase::applicationFontFamilies(lightid).at(0);
QFont font2(LightFont,QFont::Normal);
font2.setPixelSize(150);


label1->setFont(font1);
label2->setFont(font2);

label1->setText("bla bla");
label2->setText("bla bla");

字体大小正确,但字体本身不正确。从我所注意到的(尝试使用 Hairline_Montserrat、Light_Montserrat、UltraLight_Montserrat)来看,字体似乎具有某种优先级。如果我全部声明它们,所有字体都是Light字体,如果我评论那个字体类型,它们都是Hairline字体,否则(最后优先)标签使用ultralight字体。

我已经尝试添加其他字体类型(来自其他系列),在这种情况下我的代码可以正常工作。

如果我用

 qDebug()<<QFontDatabase::applicationFontFamilies(ultralightid);
 qDebug()<<QFontDatabase::applicationFontFamilies(lightid);

他们都打印了“Montserrat”家族。 我在 CMAKE 中使用了 qrc 文件和 AUTORCC 标志(使用 qmake 应该类似)并且所有文件都已正确上传。

你知道是否有另一种添加同族字体的方法?还是我做错了什么?

以下是字体:

这是一个老问题,但我在尝试在 Qt 中加载正常、粗体等版本的字体系列时遇到了完全相同的问题。

我通过简单地给每个 ttf 文件一个不同的系列名称解决了这个问题(虽然以一种有点 hacky 的方式)。我用的是Typograf,直接打开字体,右击打开属性,然后点击重命名。可能还有许多其他工具也可以执行此操作。

您不需要单独管理一个家族的字体文件。

我建议这个解决方案:

  1. 创建一个包含同一系列的所有 ttf 的文件夹。

  2. 通过id = QFontDatabase.addApplicationFont(path)

    加载文件夹中的所有文件
  3. 通过QFontDatabase.applicationFontFamilies(id)

    从这些文件中收集所有字体系列
  4. 检查是否只加载了一个所需的系列,并且系列名称是否与请求的完全相同,或者警告用户这些错误。

  5. 创建字体对象font = QFont(family)

  6. 然后例如font.setItalic(True)。如果加载了 Italic 版本的 family,将使用它,否则它将由 QT 从 Regular 创建。