Qt文本高亮显示QSyntaxHighlighter

1. QSyntaxHighlighter

通过对每个文本块应用高亮规则,将匹配的文本部分格式化。文本块可以是行、段落或其它的文本区域。

常用的函数和功能

highlightBlock:这是一个纯虚函数,开发者需要重写这个方法来定义文本的高亮规则。setFormat:用于为文本区域设置格式,包括字体、颜色等。

rehighlight:重新应用高亮规则。

currentBlockState、previousBlockState:管理文本块的状态。

setDocument、document:设置和获取高亮所作用的文档对象。

2. 示例代码讲解(代码来源:明王讲Qt例子)修改

在这个示例中,我们创建了一个名为 MyHighlighter 的类,它继承自 QSyntaxHighlighter,并定义了几种高亮规则。这些规则用于突出显示特定的文本部分,例如时间、温度、湿度和报警状态。

MyHighlighter 类的实现

cpp 复制代码
#include "MyHighlighter.h"
#include <QDebug>
#define tc(a) QString::fromLocal8Bit(a)  // 将本地8位字符转换为QString

MyHighlighter::MyHighlighter(QTextDocument* parent)
    : QSyntaxHighlighter(parent) {
    HighlightingRule rule;  // 定义高亮规则对象

    // 时间的高亮规则
    rule.pattern = QRegularExpression(R"(\[.*\])");
    timeFormat.setForeground(QColor(85, 85, 85));  // 设置字体颜色为灰色
    timeFormat.setBackground(QColor(240, 240, 240));  // 设置背景色为浅灰色
    timeFormat.setFontWeight(QFont::Bold);  // 设置字体为加粗
    timeFormat.setFontFamily("Consolas");  // 设置字体为Consolas
    rule.format = timeFormat;
    highlightingRules.push_back(rule);

    // 温度的高亮规则
    rule.pattern = QRegularExpression("温度");
    tempKeyFormat.setForeground(QColor(180, 30, 110));  // 设置字体颜色为紫色
    tempKeyFormat.setFontFamily("Consolas");
    rule.format = tempKeyFormat;
    highlightingRules.push_back(rule);

    // 温度值的高亮规则
    rule.pattern = QRegularExpression(tc(R"((?<=温度:)\s*-*\d+°C)"));
    tempValueFormat.setForeground(QColor(180, 30, 110));  // 设置字体颜色为紫色
    tempValueFormat.setFontWeight(QFont::Bold);
    tempValueFormat.setFontFamily("Consolas");
    rule.format = tempValueFormat;
    highlightingRules.push_back(rule);

    // 湿度的高亮规则
    rule.pattern = QRegularExpression("湿度");
    humiKeyFormat.setForeground(QColor(97, 54, 134));  // 设置字体颜色为紫色
    humiKeyFormat.setFontFamily("Consolas");
    rule.format = humiKeyFormat;
    highlightingRules.push_back(rule);

    // 湿度值的高亮规则
    rule.pattern = QRegularExpression(tc(R"((?<=湿度:)\s*\d+%)"));
    humiValueFormat.setForeground(QColor(97, 54, 134));  // 设置字体颜色为紫色
    humiValueFormat.setFontWeight(QFont::Bold);
    humiValueFormat.setFontFamily("Consolas");
    rule.format = humiValueFormat;
    highlightingRules.push_back(rule);

    // 报警:正常
    rule.pattern = QRegularExpression(tc("(正常)"));
    normalFormat.setForeground(Qt::darkGreen);
    normalFormat.setFontFamily("Consolas");
    rule.format = normalFormat;
    highlightingRules.push_back(rule);

    // 报警:下限
    rule.pattern = QRegularExpression(tc("(↓过低)"));
    lowerFormat.setForeground(Qt::white);
    lowerFormat.setBackground(Qt::darkBlue);
    lowerFormat.setFontWeight(QFont::Bold);
    lowerFormat.setFontFamily("Consolas");
    rule.format = lowerFormat;
    highlightingRules.push_back(rule);

    // 报警:上限
    rule.pattern = QRegularExpression(tc("(↑过高)"));
    upperFormat.setForeground(Qt::white);
    upperFormat.setBackground(QColor(220, 50, 50));
    upperFormat.setFontWeight(QFont::Bold);
    upperFormat.setFontFamily("Consolas");
    rule.format = upperFormat;
    highlightingRules.push_back(rule);
}

void MyHighlighter::highlightBlock(const QString& text) {
    for (HighlightingRule& rule : highlightingRules) {
        QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text);
        while (matchIterator.hasNext()) {
            QRegularExpressionMatch match = matchIterator.next();
            setFormat(match.capturedStart(), match.capturedLength(), rule.format);
        }
    }
}

2.1 构造函数与规则定义

在 MyHighlighter 的构造函数中,我们定义了多个高亮规则。每个规则包含一个正则表达式和一个格式。我们用不同的格式来高亮显示时间、温度、湿度以及报警状态:

时间:匹配方括号内的内容(如 [12:30]),设置灰色字体和浅灰色背景。

温度:匹配 温度 字符串,使用紫色字体。

湿度:匹配 湿度 字符串,使用紫色字体。

报警状态:根据报警类型(正常、过低、过高)设置不同的颜色和字体样式。

2.2 highlightBlock 函数

highlightBlock 函数是 QSyntaxHighlighter 类的核心方法。在这个方法中,我们遍历定义好的高亮规则,通过正则表达式来匹配文本中的特定部分。对于每个匹配到的部分,调用 setFormat 来设置它的格式。

3. QSyntaxHighlighter 类的其他常用方法

3.1 setDocument 和 documentsetDocument

用于将一个 QTextDocument 对象与高亮器关联,document 用于获取当前文档。

cpp 复制代码
void setDocument(QTextDocument *doc);
QTextDocument *document() const;

3.2 rehighlight 和 rehighlightBlock

rehighlight:重新高亮整个文档。

rehighlightBlock:只重新高亮某个文本块。

这些函数对于在文本内容发生变化时重新应用高亮规则非常有用。

cpp 复制代码
void rehighlight();
void rehighlightBlock(const QTextBlock &block);

3.3 setFormat

setFormat 用于设置匹配到的文本部分的格式,接受字符的起始位置和长度,以及相应的格式对象。

cpp 复制代码
void setFormat(int start, int count, const QTextCharFormat &format);
相关推荐
林下清风~4 分钟前
MySQL——九、锁
数据库·mysql
于壮士hoho9 分钟前
Python | Dashboard制作
开发语言·python
xiaoyaoyou.xyz34 分钟前
嵌入式Linux Qt开发:1、搭建基于ubuntu18.04的Qt开发环境及测试(解决Qt creator输入法问题)
linux·qt
呦呦鹿鸣Rzh1 小时前
redis
数据库·redis·缓存
Asus.Blogs1 小时前
为什么go语言中返回的指针类型,不需要用*取值(解引用),就可以直接赋值呢?
开发语言·后端·golang
xiaogai_gai1 小时前
有效的聚水潭数据集成到MySQL案例
android·数据库·mysql
青瓦梦滋1 小时前
【语法】C++的多态
开发语言·c++
C_V_Better1 小时前
Java Spring Boot 控制器中处理用户数据详解
java·开发语言·spring boot·后端·spring
t198751281 小时前
基于Qt的OSG三维建模
java·开发语言
web130933203982 小时前
Mysql的安装配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
数据库·mysql