QT QFont

235 篇文章 177 订阅

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和字符映射示例。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值