Qt QFont Kerning - 不影响/字距调整字体

标签 qt fonts opentype kerning

问题:QFont 的字距调整对 QApplication 中显示的字体字距调整没有影响。

  • 在 Qt 中,默认情况下,字距调整应用于 QFont
  • 尝试 QFont.setKerning(True) 失败
  • QFont.setKerning(False) 对字体显示也没有影响
  • 字体为 OpenType (.otf) 且 QFont.kerning() 返回 True
  • 在其他应用程序(例如 Microsoft Word)中成功调整此字体的字距
  • 其他 QFont 方法(例如 QFont.setLetterSpacing)可在此字体上成功运行
  • 字体为 Idler,文件名为 Idler-Inner.otf

显然没有其他人遇到这个问题。找不到有关此主题的任何内容。

更新

这似乎与字体类型有关。我能够在 Qt 中对 ttf 字体进行紧排,但无法对其他 otf 字体进行紧排。虽然 otf>ttf 转换是某些字体的解决方案,但对于像我这样的其他字体来说,它似乎会破坏字体。

令人惊讶的是 Qt 不支持主要字体类型的字距调整。否则,我能想到的唯一解决方案是破解字体(转换为 ttx 并以某种方式手动转换为 ttf ,而不会弃用它)。

字体的工作量太大;至少对于字体开发人员来说是这样。

最佳答案

查看qfontengine.cpp中的源代码,我发现了一个函数loadKerningPairs。这包含行

QByteArray tab = getSfntTable(MAKE_TAG('k', 'e', 'r', 'n'));

它似乎从字体的主表列表中加载旧式 TTF 字距调整表

此字距调整表包含字符对及其关联的调整值。它存储在 QFont 中,绘制时,通过简单的查找即可检索值。

但是,在现代 OpenType 字体(TrueType 或 Type-1 风格)中,kern 子表可能不存在,因为 OpenType 功能 GPOS更强大。这个表的二进制格式也复杂得多;例如,可以定义字符来对左、右或两个字符进行字距调整,而不是单个字符。看来这一点以及其他 OpenType 功能尚未在 QFont 中实现(截至 2016 年 9 月 11 日)。

GPOS 不仅定义字距调整,还定义许多其他功能,例如大写字母、上标和下标定位的自定义跟踪,以及在字符上或下自动放置重音符号,以及所有通过这些功能,您可以为不同的脚本类型甚至不同的语言指定不同的值。

关于Qt QFont Kerning - 不影响/字距调整字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298916/

相关文章:

python - 跨平台部署Python Qt应用 : Win, OSX, Linux

c++ - 如何在 Qt Creator 的 constexpr 函数中使用循环?

linux - 无法在 mutt 中设置电子邮件正文字体

fonts - 当我指定字体时,reportlab 字体粗细不起作用

css - 为什么谷歌字体在 Chrome 中看起来那么糟糕?

c++ - 不确定的函数返回类型

android - Android 中的 CTL(复杂文本语言)支持

c++ - QSqlQuery禁止非SELECT查询

c++ - 使用任何 c++ 函数作为 Qt 插槽

OpenType 小型大写字母的 CSS 回退