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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:56:00