如何判断QFont属于衬线/无衬线/等宽字体及对应codepage
跨平台Qt获取字体属性的实现方案
Qt未内置直接获取字体衬线属性、字符编码页的接口,可结合三大平台原生API实现对应需求,具体方案如下:
等宽/比例字体判断(三平台通用)
Qt原生提供QFontMetrics::fixedPitch()接口,可直接返回布尔值判断当前字体是否为等宽字体,无需调用原生API。
衬线/无衬线属性、编码页分平台实现方案
Windows 平台
基于GDI原生API实现:
- 调用
QFont::handle()获取当前字体对应的HFONT句柄 - 通过
GetObject()接口获取字体对应的LOGFONT结构 - 调用
GetTextMetrics()获取TEXTMETRIC结构:- 取
tmPitchAndFamily字段高4位,值为FF_ROMAN即为衬线字体,值为FF_SWISS即为无衬线字体 - 调用
EnumFontFamiliesEx()枚举字体支持的字符集,即可获取对应的codepage列表
- 取
macOS 平台
基于CoreText框架实现:
- 调用
QFont::handle()获取当前字体对应的CTFontRef实例 - 调用
CTFontCopyAttribute()获取kCTFontFamilyClassAttribute属性,值为kCTFontClassSerif即为衬线字体,值为kCTFontClassSansSerif即为无衬线字体 - 调用
CTFontCopyAvailableCharacterSets()获取字体支持的所有字符集,映射后即可得到对应的codepage信息
Linux 平台
基于Fontconfig库实现(Qt Linux版本默认依赖该库):
- 通过
QFont::family()获取当前字体的族名称 - 构造Fontconfig查询Pattern,匹配对应字体族后获取查询结果:
- 读取
FC_FAMILYCLASS字段,值为FC_FAMILY_CLASS_SERIF即为衬线字体,值为FC_FAMILY_CLASS_SANS即为无衬线字体 - 读取
FC_CHARSET字段获取字体支持的字符范围,映射后即可得到对应的codepage信息
- 读取
实现时需要在项目配置文件中对应平台下添加依赖:macOS需链接CoreText框架,Linux需链接fontconfig库,Windows平台无需额外依赖系统内置GDI库。
内容的提问来源于stack exchange,提问作者Gerald Brandt
相关产品推荐
相关产品推荐

