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
相关产品推荐
相关产品推荐

