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()函数逻辑实现:
其中QRegularExpression
是Qt 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());
程序运行截图如下: