如何加载同一系列的多种字体
Posted
技术标签:
【中文标题】如何加载同一系列的多种字体【英文标题】:How to load multiple font of same familiy 【发布时间】:2020-11-10 17:36:20 【问题描述】:我正在使用 Qt 框架编写应用程序。在显示中,我必须显示多个信息,但使用同一家族的不同类型的字体,蒙特塞拉特。
到目前为止,我为加载字体所做的是:
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 字体,否则(最后优先级)标签使用超轻字体。
我尝试添加其他字体类型(来自其他系列),在这种情况下,我的代码可以正常工作。
如果我使用
qDebug()<<QFontDatabase::applicationFontFamilies(ultralightid);
qDebug()<<QFontDatabase::applicationFontFamilies(lightid);
他们都打印了家庭“Montserrat”。 我在 CMAKE 中使用了 qrc 文件和 AUTORCC 标志(使用 qmake 应该类似)并且所有文件都正确上传。
您知道是否有其他方法可以添加同系列的字体?还是我做错了什么?
这里是字体:
https://www.onlinewebfonts.com/download/9d31c906a6cc6064bbe7d33d51058317光 https://it.allfont.net/download/montserrat-light/超轻【问题讨论】:
【参考方案1】:这是一个老问题,但当我尝试在 Qt 中加载正常、粗体、... 字体系列的版本时,我只是在努力解决完全相同的问题。
我通过简单地给每个 ttf 文件一个不同的姓氏来解决了这个问题(尽管以一种有点 hacky 的方式)。我用Typograf,只需打开字体,右键打开属性,然后点击重命名。可能还有许多其他工具也可以做到这一点。
【讨论】:
【参考方案2】:您不需要单独管理一个家族的字体文件。
我建议这个解决方案:
创建一个包含同一家族的所有 ttf 的文件夹。
通过id = QFontDatabase.addApplicationFont(path)
从文件夹中加载所有文件
通过QFontDatabase.applicationFontFamilies(id)
从这些文件中收集所有字体系列
检查是否只加载了一个所需的系列,并且系列名称与请求的系列名称完全相同,或警告用户这些错误。
创建字体对象font = QFont(family)
例如,font.setItalic(True)
。如果加载的是斜体版本的family,则使用它,否则将由QT从Regular
创建。
【讨论】:
这个解决方案适用于当前版本的 Qt,但不幸的是似乎不适用于 Kubuntu 20.04 附带的 Qt 版本。以上是关于如何加载同一系列的多种字体的主要内容,如果未能解决你的问题,请参考以下文章