Qt QFont 字距调整 - 不是 Affecting/Kerning 字体
Qt QFont Kerning - Not Affecting/Kerning Font
问题:QFont
的字距调整对 QApplication
中显示的字体字距调整没有影响。
- 在 Qt 中,字距调整默认应用于
QFont
- 已尝试
QFont.setKerning(True)
未成功
QFont.setKerning(False)
也对字体显示没有影响
- 字体为 OpenType (
.otf
) 和 QFont.kerning()
returns True
- 在 Microsoft Word 等其他应用程序中调整此字体是成功的
- 其他
QFont
方法,例如 QFont.setLetterSpacing
可在该字体上成功运行
- 字体为Idler,文件名为
Idler-Inner.otf
显然没有其他人遇到这个问题。找不到关于此主题的任何内容。
更新
这似乎与字体类型有关。我能够对 ttf 字体进行紧排,但无法对 Qt 中的其他 otf 字体进行紧排。虽然 otf>ttf 转换是某些字体的解决方案,但对于像我这样的其他字体,它似乎会破坏字体。
令人惊讶的是 Qt 不支持主要字体类型的字距调整。否则我能想到的唯一解决方案是破解字体(转换为 ttx 并以某种不反对它的方式手动转换为 ttf)。
字体工作量太大;至少对于字体开发人员而言。
查看qfontengine.cpp
中的源代码,我找到了一个函数loadKerningPairs
。这包含行
QByteArray tab = getSfntTable(MAKE_TAG('k', 'e', 'r', 'n'));
这似乎是从 table 字体的主列表中加载旧式 TTF 字距调整 table。
此字距调整 table 包含字符对及其关联的调整值。它存储在 QFont
中,绘制时,简单的查找即可检索值。
然而,在现代 OpenType 字体(TrueType 或 Type-1 风格)中,kern
subtable 可能不存在,因为 OpenType feature GPOS
就厉害多了。这个 table 的二进制格式也复杂得多;例如,可以定义字符 类 而不是单独的字符,以便对左、右或两个字符进行紧排。似乎这个以及其他 OpenType 功能还没有在 QFont 中实现(但是,根据 2016 年 9 月 11 日)。
GPOS
不仅定义了字距调整,还定义了许多其他功能,例如大写字母的自定义跟踪、上标和下标定位以及在字符上或字符下自动放置重音符,以及所有这些您可以为不同的脚本类型甚至不同的语言指定不同值的功能。
问题:QFont
的字距调整对 QApplication
中显示的字体字距调整没有影响。
- 在 Qt 中,字距调整默认应用于
QFont
- 已尝试
QFont.setKerning(True)
未成功 QFont.setKerning(False)
也对字体显示没有影响- 字体为 OpenType (
.otf
) 和QFont.kerning()
returnsTrue
- 在 Microsoft Word 等其他应用程序中调整此字体是成功的
- 其他
QFont
方法,例如QFont.setLetterSpacing
可在该字体上成功运行 - 字体为Idler,文件名为
Idler-Inner.otf
显然没有其他人遇到这个问题。找不到关于此主题的任何内容。
更新
这似乎与字体类型有关。我能够对 ttf 字体进行紧排,但无法对 Qt 中的其他 otf 字体进行紧排。虽然 otf>ttf 转换是某些字体的解决方案,但对于像我这样的其他字体,它似乎会破坏字体。
令人惊讶的是 Qt 不支持主要字体类型的字距调整。否则我能想到的唯一解决方案是破解字体(转换为 ttx 并以某种不反对它的方式手动转换为 ttf)。
字体工作量太大;至少对于字体开发人员而言。
查看qfontengine.cpp
中的源代码,我找到了一个函数loadKerningPairs
。这包含行
QByteArray tab = getSfntTable(MAKE_TAG('k', 'e', 'r', 'n'));
这似乎是从 table 字体的主列表中加载旧式 TTF 字距调整 table。
此字距调整 table 包含字符对及其关联的调整值。它存储在 QFont
中,绘制时,简单的查找即可检索值。
然而,在现代 OpenType 字体(TrueType 或 Type-1 风格)中,kern
subtable 可能不存在,因为 OpenType feature GPOS
就厉害多了。这个 table 的二进制格式也复杂得多;例如,可以定义字符 类 而不是单独的字符,以便对左、右或两个字符进行紧排。似乎这个以及其他 OpenType 功能还没有在 QFont 中实现(但是,根据 2016 年 9 月 11 日)。
GPOS
不仅定义了字距调整,还定义了许多其他功能,例如大写字母的自定义跟踪、上标和下标定位以及在字符上或字符下自动放置重音符,以及所有这些您可以为不同的脚本类型甚至不同的语言指定不同值的功能。