定义:
- 使用Qt Creator编辑代码时可以发现,输入关键字时会显示不同的颜色,这就是所谓的语法高亮。
实现方法:
Qt的富文本处理中提供了QSyntaxHighlighter类来实现语法高亮。
为了实现这个功能,需要创建QSyntaxHighlighter类的子类,然后重新实现highlightBlock( )
函数,使用时直接将QTextDocument类对象指针作为其父部件指针,这样就可以自动调用highlightBlock( )
函数了。
代码区:
- 第1步:新建QWidgets应用,基类选择QMainWindow,然后往项目里面添加一个模板C++ Class,类名为MySyntaxHighlighter,基类手动设置为QSyntaxHighlighter。完成后更改mysyntaxhighlighter.h如下:
#ifndef MYSYNTAXHIGHLIGHTER_H
#define MYSYNTAXHIGHLIGHTER_H
#include <QSyntaxHighlighter>
class MySyntaxHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
explicit MySyntaxHighlighter(QTextDocument * parent = 0);
protected:
void highlightBlock(const QString &text); // 必须重新实现该函数
};
#endif // MYSYNTAXHIGHLIGHTER_H
- 现在到mysyntaxhighlighter.cpp更改如下:
#include "mysyntaxhighlighter.h"
MySyntaxHighlighter::MySyntaxHighlighter(QTextDocument *parent):
QSyntaxHighlighter(parent)
{
}
void MySyntaxHighlighter::highlightBlock(const QString &text) // 高亮文本块,每当编辑器中的文本改变时就会调用改函数
{
QTextCharFormat myFormat; // 字符格式
myFormat.setFontWeight(QFont::Bold); // 设置加粗字体
myFormat.setForeground(Qt::green); // 将前景画笔设置为指定的画笔。前景画笔主要用于渲染文本
QString parent = "\\bchar\\b"; // 要匹配的单词,这里是"char"单词
QRegExp expression(parent); // 创建正则表达式
int index = text.indexOf(expression); // 从位置0(默认)开始匹配字符串
// 如果匹配成功,那么返回为字符串的起始位置,它大于或等于0
while(index >= 0) {
int length = expression.matchedLength(); //要匹配字符串的长度
setFormat(index, length, myFormat); // 对要匹配的字符串设置格式
index = text.indexOf(expression, index + length); // 继续匹配
}
}
这里主要使用了正则表达式和QString类的
index( )
函数来进行字符串匹配,如果匹配成功,则使用QSyntaxHighlighter类的setFormat( )
函数来设置字符格式。第2步:向界面拖入一个Text Edit,并在mainwindow.h中添加类的前置声明
class MySyntaxHighlighter;
- 然后添加私有对象指针:
MySyntaxHighlighter * highlighter;
- 到mainwindow.cpp添加头文件:
#include "mysyntaxhighlighter.h"
- 然后在MainWindow (mainwindow.cpp中)类构造函数的最后添加一行代码:
highlighter = new MySyntaxHighlighter(ui->textEdit->document());
几点说明:
- 这里创建了MySyntaxHighlighter类的对象,并且使用编辑器(Text Edit)的文档对象指针作为其参数(父部件),这样每当编辑器中的文本改变时都会调用
highlightBlock( )
函数;来设置语法高亮。现在运行程序,输入“char”查看效果。 -
- 关于语法高亮,可以查看Syntax Highlighter Example示例程序。
HTML
- 在富文本处理中还提供了对HTML子集的支持,可以在QLabel或者QText Edit添加文本时使用HTML标签或者CSS属性,具体内容可以在帮助中通过Supported HTML Subset关键字查看,下面给出一个最简单的例子。
- 在mainwindow.cpp文件中的构造函数最后添加下面一行代码:
ui->textEdit->append(tr("< h1 > <font color = red > 使用HTML < /font > < /h1 >")); // 在末尾添加字符串
这里往编辑器最后添加了文本,并且使用了HTML标签,运行程序查看效果。