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

Seb*_*nki 3 c++ fonts qt

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

Rei*_*ica 5

这是一次经典的旅行.

逻辑上,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()));
Run Code Online (Sandbox Code Playgroud)