QFontComboBox调用setCurrentFont后重复出现Monospace条目求助
问题解决方案
问题1:调用setCurrentFont后Monospace条目重新出现
在Linux系统的Qt 5.15/6.6.1中,QFontComboBox默认会包含逻辑字体族(如Monospace、Sans Serif这类通用族名,并非实际安装的字体文件),即使手动过滤添加真实字体,调用setCurrentFont时,Qt会自动关联并显示对应的逻辑族条目。
解决方法:
- 初始化
QFontComboBox时设置字体过滤器,只显示系统实际安装的字体,排除逻辑字体:
该过滤器组合仅展示真实存在的可缩放/不可缩放字体,不会包含fontComboBox->setFontFilters(QFontComboBox::ScalableFonts | QFontComboBox::NonScalableFonts);Monospace这类逻辑族。 - 简化字体过滤逻辑:
QFontDatabase::families()返回的已经是系统中存在的有效字体族,无需再通过QFont(family).exactMatch()判断,若需保留Courier相关字体,可直接过滤:QStringList filteredFonts = db.families().filter(QRegularExpression("^Courier"));
问题2:选择Monospace后重新打开变为DejaVu Sans Mono
Monospace是Qt定义的逻辑字体,并非真实安装的字体文件,Qt会将其映射到系统默认的等宽字体(Linux下通常为DejaVu Sans Mono)。保存该字体并重新加载时,Qt会解析为实际映射的字体,而非逻辑族名。
解决方法:
- 直接通过上述字体过滤器隐藏
Monospace这类逻辑字体条目,从根源避免用户选择它。 - 若必须保留逻辑字体,保存字体时记录其实际映射的族名而非逻辑族名:
// 用户选择字体时,获取真实族名 QString actualFamily = font.family(); if (QFontDatabase::isLogicalFont(font)) { QFont resolvedFont = QFontDatabase::resolveFont(font); actualFamily = resolvedFont.family(); } // 保存actualFamily而非原逻辑族名
完整修改后的测试代码
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(this); // 设置过滤器,排除逻辑字体 fontComboBox->setFontFilters(QFontComboBox::ScalableFonts | QFontComboBox::NonScalableFonts); QFontDatabase db; QStringList filteredFonts = db.families(); QFont defaultFont; bool foundDefault = false; for (const QString& family : filteredFonts) { if (family.startsWith("Courier")) { defaultFont = QFont(family); foundDefault = true; break; // 找到第一个Courier字体即可 } } fontComboBox->clear(); fontComboBox->addItems(filteredFonts); if (foundDefault) { fontComboBox->setCurrentFont(defaultFont); } connect(fontComboBox, &QFontComboBox::currentFontChanged, this, &MainWindow::fontUpdate); } void MainWindow::fontUpdate(const QFont& font) { // 可选:获取真实字体族名 QString actualFamily = font.family(); if (QFontDatabase::isLogicalFont(font)) { QFont resolvedFont = QFontDatabase::resolveFont(font); actualFamily = resolvedFont.family(); } // 后续业务逻辑使用actualFamily }
内容的提问来源于stack exchange,提问作者Peter S
相关产品推荐
相关产品推荐

