You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 15:45:04