问题: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/