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

Linux/X11下QTextEdit小字号时extraSelections失效问题求助

临时解决Linux/X11下Qt小字号QTextEdit extraSelections高亮不全问题

问题背景

在Ubuntu 20.04/22.04、Qt 5.15.2/6.2.4/6.4的X11环境中,当QTextEdit(含QPlainTextEdit)设置12号及以下字号且开启文本自动换行时,extraSelections无法高亮所有目标文本。字号13及以上、未指定字号,或Windows/macOS/Wayland环境下无此问题,该BUG已提交为QTBUG-108149。

临时解决方案

以下是官方修复前可采用的几种临时处理方案:

  • 字号偏移+行高补偿
    针对X11环境下的小字号,临时将字号增大1号,同时按比例调整行高,保持视觉上的字号大小不变,避开BUG触发条件:

    QFont editFont = ui->textEdit->font();
    const int targetSize = 12;
    // 判断当前是否为X11平台(xcb是Qt对X11的标识)
    if (targetSize <= 12 && QGuiApplication::platformName() == "xcb") {
        editFont.setPointSize(targetSize + 1);
        // 按原字号与新字号的比例调整行高,维持视觉行高一致
        const qreal originalLineHeight = ui->textEdit->lineHeight();
        ui->textEdit->setLineHeight(originalLineHeight * targetSize / static_cast<qreal>(targetSize + 1));
    } else {
        editFont.setPointSize(targetSize);
    }
    ui->textEdit->setFont(editFont);
    
  • 替换高亮实现逻辑
    放弃使用extraSelections,改用直接修改文本字符格式的方式实现高亮(需注意保存原格式,方便后续恢复):

    // 示例:高亮指定文本范围
    QTextCursor cursor = ui->textEdit->textCursor();
    // 这里以选中光标所在单词为例,可替换为你的目标文本范围
    cursor.select(QTextCursor::WordUnderCursor);
    QTextCharFormat originalFormat = cursor.charFormat();
    // 保存原格式,用于取消高亮时恢复
    // 自定义高亮格式
    QTextCharFormat highlightFormat = originalFormat;
    highlightFormat.setBackground(QColor(Qt::yellow));
    cursor.setCharFormat(highlightFormat);
    
  • 禁用自动换行(业务允许时)
    如果业务场景不需要自动换行,直接关闭该功能即可避免触发BUG:

    ui->textEdit->setLineWrapMode(QTextEdit::NoWrap);
    

内容的提问来源于stack exchange,提问作者HiFile.app - best file manager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:05:23