一、描述
此类用于自定义语法高亮显示规则,是用于实现 QTextDocument 文本高亮显示的基类。
要自定义语法高亮显示,必须子类化 QSyntaxHighlighter 并重新实现 highlightBlock()。此函数将在合适的时机自动被调用。
highlightBlock() 函数将格式设置应用于传递给它的文本。setFormat() 函数将给定的QTextCharFormat 应用于当前文本块。例如:
class MyHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
MyHighlighter(QTextDocument *parent = nullptr)
: QSyntaxHighlighter(parent)
{
}
protected:
void highlightBlock(const QString &text) override;
};
void MyHighlighter::highlightBlock(const QString &text)
{
QTextCharFormat matchFormat;
matchFormat.setFontWeight(QFont::Bold);
matchFormat.setForeground(Qt::red);
static QRegularExpression expression{"\\bname=[A-Za-z]+\\b"};
QRegularExpressionMatchIterator i = expression.globalMatch(text);
while (i.hasNext())
{
QRegularExpressionMatch match = i.next();
setFormat(match.capturedStart(), match.capturedLength(), matchFormat);
}
}
MyHighlighter *highlighter = new MyHighlighter(ui->textEdit->document());
编辑框中匹配正则表达式的内容被设置为指定的格式。
二、成员函数
1、void rehighlight()
将高亮显示重新应用于整个文档。
2、void rehighlightBlock(const QTextBlock &block)
将高亮显示重新应用于文本块。
3、QTextBlock currentBlock()
当前文本块。
4、void highlightBlock(const QString &text)
高亮显示给定的文本块。富文本引擎在必要时调用此函数,即在已更改的文本块上调用。
5、void setCurrentBlockUserData(QTextBlockUserData *data)
QTextBlockUserData 类用于将自定义数据与文本块相关联。
此函数将 data 附着到当前文本块。
struct info
{
QString name;
int age;
};
struct BlockData : public QTextBlockUserData
{
QList<info> infoList;
};
class MyHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
MyHighlighter(QTextDocument *parent = nullptr)
: QSyntaxHighlighter(parent)
{
}
protected:
void highlightBlock(const QString &text) override;
};
void MyHighlighter::highlightBlock(const QString &text)
{
QTextCharFormat matchFormat;
matchFormat.setFontWeight(QFont::Bold);
matchFormat.setForeground(Qt::red);
static QRegularExpression expression{"\\bname=[A-Za-z]+\\b"};
QRegularExpressionMatchIterator i = expression.globalMatch(text);
int number{1};
while (i.hasNext())
{
QRegularExpressionMatch match = i.next();
setFormat(match.capturedStart(), match.capturedLength(), matchFormat);
QList<info> infoList;
info data;
data.name = QString("name%1").arg(number);
data.age = number;
infoList << data;
++number;
data.name = QString("name%1").arg(number);
data.age = number;
infoList << data;
++number;
BlockData * bd = new BlockData;
bd->infoList = infoList;
setCurrentBlockUserData(bd);
}
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
MyHighlighter *highlighter = new MyHighlighter(ui->textEdit->document());
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QTextBlock currentBlock = ui->textEdit->document()->begin();
while (currentBlock.isValid())
{
currentBlock = currentBlock.next();
if(auto bd = static_cast<BlockData*>(currentBlock.userData()))
{
qDebug()<<"xxx";
for(const info &data : bd->infoList)
{
qDebug()<<data.name;
qDebug()<<data.age;
}
}
}
}
6、void setFormat(int start, int count, const QTextCharFormat &format)
void setFormat(int start, int count, const QColor &color)
此函数应用于语法高亮显示的当前文本块(即传递给 highlightBlock() 函数的文本)。
指定的格式 format 从 start 位置应用于文本,长度为 count 个字符(如果count为0,则不执行任何操作)。
通过此函数设置的格式不会修改文档本身。
void setFormat(int start, int count, const QFont &font)
void setFormat(int start, int count, const QColor &color)
指定的字体 / 颜色从 start 位置应用于当前文本块,长度为 count 个字符。
当前文本块的其他属性(例如字体和背景色)将重置为默认值。