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

