Gentoo KDE环境下QFontDialog显示不支持区域字体,如何排除?
解决QFontDialog中排除不支持区域字体的问题
方法一:通过fontconfig系统级过滤
直接配置fontconfig屏蔽特定字体或按语言区域筛选,整个系统的字体列表都会生效,QFontDialog自然不会显示不支持的字体:
- 创建或编辑
/etc/fonts/local.conf,添加以下规则:<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> <fontconfig> <!-- 直接排除Noto Rashi Hebrew字体 --> <selectfont> <rejectfont> <pattern> <patelt name="family"> <string>Noto Rashi Hebrew</string> </patelt> </pattern> </rejectfont> </selectfont> <!-- 可选:只保留支持英文、俄文的字体 --> <match> <test name="lang" compare="not_eq"> <string>en</string> <string>ru</string> </test> <edit name="family" mode="assign"> <string>sans-serif</string> </edit> </match> </fontconfig> - 执行命令刷新fontconfig缓存:
fc-cache -fv
方法二:Qt应用代码层面过滤
如果不想修改系统配置,可在代码里自定义QFontDialog的字体列表,但注意原生对话框无法直接修改,需要禁用原生对话框:
QFontDialog dialog; QFontDatabase db; QStringList allFamilies = db.families(); QStringList filteredFamilies; // 筛选支持英文(Latin)或俄文(Cyrillic)的字体 for (const QString &family : allFamilies) { auto writingSystems = db.writingSystems(family); if (writingSystems.contains(QFontDatabase::Latin) || writingSystems.contains(QFontDatabase::Cyrillic)) { filteredFamilies.append(family); } } // 禁用原生对话框,设置过滤后的字体列表 dialog.setOption(QFontDialog::NoNativeDialog); dialog.setFamilies(filteredFamilies); if (dialog.exec() == QDialog::Accepted) { QFont selectedFont = dialog.selectedFont(); // 后续处理选中的字体 }
方法三:卸载不需要的字体包
在Gentoo里直接移除包含该字体的包:
- 查找字体所属的包:
equery b /usr/share/fonts/noto/NotoRashiHebrew-Regular.ttf - 卸载对应包:
emerge -C <找到的包名>
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

