我们实现语法高亮的时候用到Qt自带的一个类,是QSyntaxHighlighter类实现,在输出字的时候查找关键字设置高亮。
添加新文件:
自定义文件,将QSyntaxHighlighter作为基类
MySyntaxHighlighter头文件:
#ifndef MYSYNTAXHIGHLIGHTER_H
#define MYSYNTAXHIGHLIGHTER_H
#include<QSyntaxHighlighter>
class MySyntaxHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
MySyntaxHighlighter(QTextDocument* parent=0);
protected:
void highlightBlock(const QString&text);
};
#endif // MYSYNTAXHIGHLIGHTER_H
增加元对象Q_object,增加参数QTextDocument* parent,用来初始化父类。
重写高亮函数highlightBlock()
MySyntaxHighlighter源文件:
#include "mysyntaxhighlighter.h"
MySyntaxHighlighter::MySyntaxHighlighter(QTextDocument* parent):QSyntaxHighlighter(parent)
{
}
//重写高亮方法
void MySyntaxHighlighter::highlightBlock(const QString &text)
{
QTextCharFormat format;//定义一个字符格式
format.setFontWeight(QFont::Bold);
format.setBackground(Qt::lightGray);
format.setForeground(Qt::blue);
QString pattern="\\bgood\\b";//将good作为关键字
QRegExp expression(pattern);
int index=text.indexOf(expression);//将文本与表达式匹配,如果匹配到了就返回字符出现的位置,没有就返回-1
while(index>=0){
int length=expression.matchedLength();//匹配到的字符长度
setFormat(index,length,format);
index=text.indexOf(expression,index+length);
}
}
高亮重写,先设定一个字符格式对象format,再进一步设置字体格式,设置好之后再定义一个字符串pattern匹配good,\\b表示字体边界,又再用QRegExp定义一个正则表达式对象,indexof会返回第一次匹配到指定下标字符串的位置,如果没有匹配到就返回-1结束训话。高亮的操作还是离不开setFormat函数。
在mainwindow头文件添加一个成员:
MySyntaxHighlighter *m_slighter;//语法高亮对象
mainwindow构造函数添加代码:
//初始化高亮对象
m_slighter=new MySyntaxHighlighter(ui->textEdit->document());
高亮效果: