Qt QFont Kerning - 不影响/修改字体

时间:2016-09-02 18:45:01

标签: 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

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

更新

这似乎与字体类型有关。我能够克服ttf字体而无法在Qt中使用其他otf字体。虽然otf> ttf转换是某些字体的解决方案 - 对于像我这样的其他字体,它似乎会破坏字体。

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

字体工作太多;至少对于字体的开发者而言。

1 个答案:

答案 0 :(得分:4)

查看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不仅定义了字距调整,还定义了许多其他功能,例如大写字母的自定义跟踪,上标和下标定位,以及在字符上或字符下自动放置重音符号,以及所有这些功能可以为不同的脚本类型甚至不同的语言指定不同的值。