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

问题描述 投票:0回答:2

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

c++ qt fonts
2个回答
7
投票

这是一次经典的失败。

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
称为物理字体。


0
投票

Sans
是家族别名。

Droid Sans
是字体系列名称。

QFont("Sans") 返回带有系列“Sans”的字体和最接近您请求的参数(.boldness、大小、语言、脚本、功能等)

© www.soinside.com 2019 - 2024. All rights reserved.