Qt 语法高亮设置

      QT设置语法高亮需要自定义一个类并且要继承QSyntaxHighlighter类,这个类也就是Qt自带的语法高亮类,继承这个类要重写一个方法(它是一个纯虚函数),这个方法会在你的文本有改动时自动调用,方法名如下:

// 参数text也就是需要设置高亮的文本块,不需要自己传参
void highlightBlock(const QString &text) override;

我的自定义语法高亮类头文件,详细见注释

class SyntaxLight : public QSyntaxHighlighter
{
    
    
    Q_OBJECT
public:
	// 在创建该类时,将传递要设置语法高亮文本的document
    SyntaxLight(QTextDocument* parent = nullptr);

protected:
	// 在此函数内编写语法高亮的逻辑
    void highlightBlock(const QString &text) override;
};

highlightBlock()函数逻辑实现:
          其中QRegularExpressionQt 5.0加入的,它相对于QRegExp(之前的版本)修复了很多bug,所以就采用这个类来实现语法高亮。

void SyntaxLight::highlightBlock(const QString &text)
{
    
    
	// 设置(要高亮的)字符格式类
    QTextCharFormat format;
    format.setFontItalic(10); //设置斜体
    format.setForeground(Qt::blue); //设置文字颜色为蓝色

    QRegularExpression rex; //正则表达式类
    rex.setPattern("^#include\\s<.+>$"); //设置正则表达式

	// 全局匹配,并且返回正则表达式全局匹配结果的迭代器
	// 详情可查Qt助手
    QRegularExpressionMatchIterator it = rex.globalMatch(text);

    while(it.hasNext()) //上一个是否匹配成功
    {
    
    
    	// 返回匹配结果,并且迭代器++
        QRegularExpressionMatch ma = it.next();
        // 设置格式
        setFormat(ma.capturedStart(), ma.capturedLength(), format);
    }
}

highlightBlock()函数中逻辑实现好后,就可以到你的文本类(我的文本类继承自QTextEdit)中创建自己的语法高亮类了, 然后将当前文档类传个它就不需要自己管了,系统会自动调用,如下:

syn = new SyntaxLight(m_textEdit->document());

程序运行截图如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45337964/article/details/121388514