QFontDatabase 不包含所有字体系列,或者它有不同的名称

QFontDatabase doesn't contain all the fonts families or it has different names

本文关键字:包含所 字体 系列 QFontDatabase 或者      更新时间:2023-10-16

我正在使用font().family()获取QWidget的默认字体系列。我将其与我从QFontDatabase().families()获得的QStringList进行比较。默认字体的家族是"Sans",但我找不到在我从QFontDatabase获得的列表中,我只能找到Sans Serif,Droid Sans,FreeSans等。为什么QWidget的默认字体甚至不会出现在系统的字体上?

这是一个经典的绊脚石。

从逻辑上讲,QFont是对字体的请求。它可能会被一些与请求不太匹配的东西来满足。实际字体可从 QFontInfo .

如果你考虑一下,你可以把"随便"放在一个QFont.QFont什么时候应该改变自己以指示实际选择的字体?如果您在小部件上设置字体,然后将其读回,并且它被更改以匹配那里的字体,那将是相当令人困惑的。因此,没有一个QFont可以变形的合理点,所以QFont只能是一个请求。

您可以控制QFont,但系统的字体可用性和其他约束控制匹配QFontInfo

不变性可以表示为:

QFontDatabase db;
QFont const font = widget->font();
QStringList const families = db.families();
Q_ASSERT(families.contains(font.family()) || true);
QFontInfo const info(font);
Q_ASSERT(families.contains(info.family()));
Sans是一个

家族别名。

Droid Sans是字体系列名称。

QFont("Sans") 返回一个字体,其中包含家族 "Sans" 和最接近请求的参数(.boldness、size、lang、script、features等)