You need to enable JavaScript to run this app. Qt中如何检测字体为Serif(衬线)或SansSerif(无衬线)类型?
优惠活动
大模型
产品
解决方案
定价
更多

Qt中如何检测字体为Serif(衬线)或SansSerif(无衬线)类型?

Qt 5.15 判断系统字体衬线/无衬线类型的解决方法

原代码失效原因

QFont::styleHint()返回的是互斥枚举值QFont::StyleHint,不属于位掩码类型,不适合用位与运算做判断;同时直接调用QFont对象的styleHint()拿到的是构造字体时设置的预期样式提示,不是系统实际安装字体的真实属性。

正确实现方案

需要配合QFontDatabase遍历系统字体,通过QFontInfo获取字体真实的样式属性,直接做等值判断即可:

#include <QFontDatabase>
#include <QFontInfo>
#include <QDebug>

void classifySystemFonts()
{
    QFontDatabase fontDb;
    // 获取全量系统字体家族
    QStringList fontFamilies = fontDb.families();

    for (const QString& familyName : qAsConst(fontFamilies)) {
        QFont tempFont(familyName);
        // QFontInfo可获取匹配到的系统实际字体的真实属性
        QFontInfo actualFontInfo(tempFont);
        QFont::StyleHint realHint = actualFontInfo.styleHint();

        bool isSerif = (realHint == QFont::Serif);
        bool isSansSerif = (realHint == QFont::SansSerif);

        // 输出结果可按需修改为存储到列表逻辑
        qDebug() << "字体名称:" << familyName
                 << " 衬线字体:" << isSerif
                 << " 无衬线字体:" << isSansSerif;
    }
}

补充优化建议

部分小众字体可能没有在系统中注册对应的样式提示,会出现识别不准的情况,可以增加字体名称关键词匹配做兜底判断:

  • 衬线字体常见关键词:Serif、宋体、SimSun、Times、Kai(楷体)
  • 无衬线字体常见关键词:Sans、黑体、Hei、PingFang、Roboto、Arial、YaHei(微软雅黑)

内容的提问来源于stack exchange,提问作者Pickaboo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:36:03