QFont类指定用于绘制文本的字体。
创建QFont对象时,可以指定希望字体具有的各种属性。Qt将使用具有指定属性的字体,或者如果不存在匹配的字体,Qt将使用最匹配的已安装字体。实际使用的字体属性可从QFontInfo对象检索。如果窗口系统提供精确匹配,exactMatch()返回true。使用QFontMetrics获取测量值,例如,使用QFontMetrics::width()获取字符串的像素长度。
请注意,QGuiApplication实例必须存在,才能使用QFont。可以使用QGuiApplication::setFont()设置应用程序的默认字体。
如果所选字体不包含需要显示的所有字符,QFont将尝试在最接近的等效字体中查找字符。当qPaint从字体中绘制字符时,QFont将报告它是否具有该字符;如果没有,QPainter将绘制一个未填充的正方形。
创建如下Qfont:
QFont serifFont("Times", 10, QFont::Bold);
QFont sansFont("Helvetica [Cronyx]", 12);
构造函数中设置的属性也可以稍后设置,例如setFamily()、setPointSize()、setPointSizeF()、setWeight()和setItalic()。其余属性必须在construction之后设置,例如setBold()、setUnderline()、setOverline()、setTrikeOut()和setFixedPitch()。QFontInfo对象应该在设置字体属性之后创建。QFontInfo对象不会更改,即使更改字体的属性也是如此。相应的“get”函数(例如family()、pointSize()等)返回设置的值,即使使用的值可能不同。实际值可从QFontInfo对象获得。
如果请求的字体系列不可用,您可以通过使用setStyleHint()选择特定的QFont::StyleHint和QFont::StyleStrategy来影响字体匹配算法。defaultFamily()返回默认族(对应于当前样式提示)。
字体匹配算法有一个lastreatfamily()和lastreatfont(),以防找不到合适的匹配。可以使用insertSubstitution()和insertSubstitutions()为字体系列名称提供替换。替换可以用removeSubstitutions()删除。使用substitute()检索族的第一个替代项,如果没有替代项,则检索族名称本身。使用substitutes()检索族的替代项列表(可以为空)。
每个QFont都有一个key(),您可以使用它作为缓存或字典中的键。如果要存储用户的字体首选项,可以使用QSettings,用toString()写入字体信息,用fromString()读回。operator<<()和operator>>()函数也可用,但它们在数据流上工作。
可以使用setPixelSize()将屏幕上显示的字符高度设置为指定的像素数;但是,使用setPointSize()会产生类似的效果,并提供设备独立性。
加载字体可能很昂贵,尤其是在X11上。QFont包含大量的优化,可以快速复制QFont对象,并缓存它所依赖的慢窗口系统函数的结果。
字体匹配算法的工作原理如下:
- 将搜索指定的字体系列
- 如果找不到,则使用styleHint()选择替换族
- 搜索每个替换字体系列
- 如果这些都没有找到或没有styleHint(),则会搜索“helvetica”
- 如果找不到“helvetica”,Qt将尝试lastreatfamily()
- 如果找不到lastreatfamily(),Qt将尝试lastreatfont(),它将始终返回某种名称
请注意,实际的字体匹配算法因平台而异。
在Windows中,对“Courier”字体的请求会自动更改为“Courier New”,这是Courier的一个改进版本,允许平滑缩放。通过设置PreferBitmap样式策略(请参阅setStyleStrategy()),可以选择较旧的“Courier”位图字体。
一旦找到字体,其余属性将按优先级顺序匹配:
- fixedPitch()
- pointSize() (see below)
- weight()
- style()
如果您有一种字体在族上匹配,即使其他属性都不匹配,也会优先选择这种字体,而不是在族上不匹配但在其他属性上匹配的字体。这是因为字体系列是主要的搜索条件。
如果点大小在请求点大小的20%以内,则定义为匹配。当多个字体匹配且仅按点大小区分时,将选择与所请求字体点大小最接近的字体。
用于绘制文本的实际族、字号、粗细和其他字体属性将取决于窗口系统下所选族的可用属性。QFontInfo对象可用于确定用于绘制文本的实际值。
示例:
QFont f("Helvetica");
如果你有一个Adobe和一个Cronyx Helvetica,你可能会得到任何一个。
QFont f("Helvetica [Cronyx]");
您可以在族名称中指定所需的铸造厂。上面示例中的字体f将设置为“Helvetica[Cronyx]”。
要确定窗口系统中实际使用的字体的属性,请使用QFontInfo对象,例如。
QFontInfo info(f1);
QString family = info.family();
要找出字体度量,请使用QFontMetrics对象,例如。
QFontMetrics fm(f1);
int textWidthInPixels = fm.width("How many pixels wide is this text?");
int textHeightInPixels = fm.height();
有关字体的更多常规信息,请参阅comp.fonts常见问题解答。有关编码的信息可以在Roman Czyborra的页面上找到。
另请参见QFontMetrics、QFontInfo、QFontDatabase和字符映射示例。