我使用 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()));
在 win32 GDI 中,
QFont
称为逻辑字体,QFontInfo
称为物理字体。
Sans
是家族别名。
Droid Sans
是字体系列名称。
QFont("Sans") 返回带有系列“Sans”的字体和最接近您请求的参数(.boldness、大小、语言、脚本、功能等)