问题:对我的QFont
进行字距调整不会影响我QApplication
中显示的字体字距。
QFont
QFont.setKerning(True)
失败QFont.setKerning(False)
对字体显示也没有影响.otf
),QFont.kerning()
返回True
QFont
方法,例如QFont.setLetterSpacing
在此字体上成功运作Idler-Inner.otf
显然没有其他人遇到这个问题。找不到关于这个主题的任何内容。
这似乎与字体类型有关。我能够克服ttf字体而无法在Qt中使用其他otf字体。虽然otf> ttf转换是某些字体的解决方案 - 对于像我这样的其他字体,它似乎会破坏字体。
令人惊讶的是,Qt不支持主要字体类型的字距调整。否则,我能想到的唯一解决方案就是破解字体(转换为ttx并以某种方式手动转换为ttf,不会弃用它)。
字体工作太多;至少对于字体的开发者而言。
答案 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
不仅定义了字距调整,还定义了许多其他功能,例如大写字母的自定义跟踪,上标和下标定位,以及在字符上或字符下自动放置重音符号,以及所有这些功能可以为不同的脚本类型甚至不同的语言指定不同的值。