QSyntaxHighlighter Class
QSyntaxHighlighter 类允许您定义语法高亮规则,此外,您还可以使用该类查询文档的当前格式或用户数据。更多
头文件: | #include <QSyntaxHighlighter> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
继承: | QObject |
- 所有成员(包括继承成员)的列表
- QSyntaxHighlighter 是富文本处理 API 的一部分。
注意:该类中的所有函数都是可重入的。
公共函数
QSyntaxHighlighter(QObject *parent) | |
QSyntaxHighlighter(QTextDocument *parent) | |
virtual | ~QSyntaxHighlighter() |
QTextDocument * | document() const |
void | setDocument(QTextDocument *doc) |
公共槽
void | rehighlight() |
void | rehighlightBlock(const QTextBlock &block) |
保护函数
QTextBlock | currentBlock() const |
int | currentBlockState() const |
QTextBlockUserData * | currentBlockUserData() const |
QTextCharFormat | format(int position) const |
virtual void | highlightBlock(const QString &text) = 0 |
int | previousBlockState() const |
void | setCurrentBlockState(int newState) |
void | setCurrentBlockUserData(QTextBlockUserData *data) |
void | setFormat(int start, int count, const QTextCharFormat &format) |
void | setFormat(int start, int count, const QColor &color) |
void | setFormat(int start, int count, const QFont &font) |
详细说明
QSyntaxHighlighter 类是实现QTextDocument 语法高亮器的基类。语法高亮器会自动高亮显示QTextDocument 中的部分文本。语法高亮器通常用于用户以特定格式输入文本(例如源代码)时,帮助用户阅读文本并识别语法错误。
要提供自己的语法高亮,您必须子类化 QSyntaxHighlighter 并重新实现highlightBlock().
创建 QSyntaxHighlighter 子类的实例时,将您希望应用语法高亮的QTextDocument 传递给它。例如
QTextEdit *editor = new QTextEdit; MyHighlighter *highlighter = new MyHighlighter(editor->document());
之后,您的highlightBlock() 函数将在必要时被自动调用。使用highlightBlock() 函数对传入的文本应用格式化(如设置字体和颜色)。QSyntaxHighlighter 提供了setFormat() 函数,可对当前文本块应用给定的QTextCharFormat 。例如
void MyHighlighter::highlightBlock(const QString &text) { QTextCharFormat myClassFormat; myClassFormat.setFontWeight(QFont::Bold); myClassFormat.setForeground(Qt::darkMagenta); QRegularExpression expression("\\bMy[A-Za-z]+\\b"); QRegularExpressionMatchIterator i = expression.globalMatch(text); while (i.hasNext()) { QRegularExpressionMatch match = i.next(); setFormat(match.capturedStart(), match.capturedLength(), myClassFormat); } }
某些语法的结构可以跨越多个文本块。例如,C++ 语法高亮器应能够处理/
*...*
/
多行注释。要处理这些情况,就必须知道前一个文本块的结束状态(如 "在注释中")。
在highlightBlock() 实现中,您可以使用previousBlockState() 函数查询前一个文本块的结束状态。解析文本块后,可以使用setCurrentBlockState() 保存最后的状态。
currentBlockState() 和previousBlockState() 函数返回一个 int 值。如果没有设置状态,返回值为-1。您可以使用setCurrentBlockState() 函数指定任何其他值来标识任何给定状态。一旦设置了状态,QTextBlock 就会保留该值,直到再次设置或删除相应的文本段落为止。
例如,如果您正在编写一个简单的 C++ 语法高亮器,您可以指定 1 表示 "注释中":
QTextCharFormat multiLineCommentFormat; multiLineCommentFormat.setForeground(Qt::red); QRegularExpression startExpression("/\\*"); QRegularExpression endExpression("\\*/"); setCurrentBlockState(0); int startIndex = 0; if (previousBlockState() != 1) startIndex = text.indexOf(startExpression); while (startIndex >= 0) { QRegularExpressionMatch endMatch; int endIndex = text.indexOf(endExpression, startIndex, &endMatch); int commentLength; if (endIndex == -1) { setCurrentBlockState(1); commentLength = text.length() - startIndex; } else { commentLength = endIndex - startIndex + endMatch.capturedLength(); } setFormat(startIndex, commentLength, multiLineCommentFormat); startIndex = text.indexOf(startExpression, startIndex + commentLength); }
在上面的示例中,我们首先将当前代码块的状态设置为 0。然后,如果上一个代码块在注释中结束,我们就从当前代码块的开头开始高亮 (startIndex = 0
)。否则,我们将搜索给定的起始表达式。如果在文本块中找不到指定的结束表达式,我们就调用setCurrentBlockState() 改变当前块的状态,并确保高亮显示文本块的其余部分。
此外,您还可以分别使用format() 和currentBlockUserData() 函数查询当前格式和用户数据。您还可以使用setCurrentBlockUserData() 函数将用户数据附加到当前文本块。QTextBlockUserData 可用于存储自定义设置。在语法高亮的情况下,它作为缓存存储您在解析段落文本时可能发现的信息尤为有趣。有关示例,请参阅setCurrentBlockUserData() 文档。
另请参阅 QTextDocument 和语法高亮示例。
成员函数文档
[explicit]
QSyntaxHighlighter::QSyntaxHighlighter(QObject *parent)
使用给定的parent 构建 QSyntaxHighlighter。
如果父文档是QTextEdit ,则会在父文档上安装语法高亮显示器。指定的QTextEdit 也将成为 QSyntaxHighlighter 的所有者。
[explicit]
QSyntaxHighlighter::QSyntaxHighlighter(QTextDocument *parent)
构建 QSyntaxHighlighter 并将其安装到parent 上。指定的QTextDocument 也将成为 QSyntaxHighlighter 的所有者。
[virtual noexcept]
QSyntaxHighlighter::~QSyntaxHighlighter()
销毁器从文本文档中卸载语法高亮显示器。
[protected]
QTextBlock QSyntaxHighlighter::currentBlock() const
返回当前文本块。
[protected]
int QSyntaxHighlighter::currentBlockState() const
返回当前文本块的状态。如果没有设置值,返回值为-1。
另请参阅 setCurrentBlockState()。
[protected]
QTextBlockUserData *QSyntaxHighlighter::currentBlockUserData() const
返回先前附加到当前文本块的QTextBlockUserData 对象。
另请参阅 QTextBlock::userData() 和setCurrentBlockUserData()。
QTextDocument *QSyntaxHighlighter::document() const
返回安装此语法高亮程序的QTextDocument 。
另请参阅 setDocument().
[protected]
QTextCharFormat QSyntaxHighlighter::format(int position) const
返回语法高亮显示当前文本块内position 的格式。
另请参阅 setFormat().
[pure virtual protected]
void QSyntaxHighlighter::highlightBlock(const QString &text)
突出显示给定的文本块。富文本引擎会在必要时调用该函数,即在文本块发生变化时。
要提供自己的语法高亮功能,必须子类化QSyntaxHighlighter 并重新实现 highlightBlock()。在重新实现过程中,您应解析块的text ,并在必要时调用setFormat() 以应用所需的字体和颜色更改。例如
void MyHighlighter::highlightBlock(const QString &text) { QTextCharFormat myClassFormat; myClassFormat.setFontWeight(QFont::Bold); myClassFormat.setForeground(Qt::darkMagenta); QRegularExpression expression("\\bMy[A-Za-z]+\\b"); QRegularExpressionMatchIterator i = expression.globalMatch(text); while (i.hasNext()) { QRegularExpressionMatch match = i.next(); setFormat(match.capturedStart(), match.capturedLength(), myClassFormat); } }
有关使用setCurrentBlockState(),currentBlockState() 和previousBlockState() 处理跨多个文本块的结构体语法的示例,请参阅Detailed Description 。
另请参阅 previousBlockState(),setFormat() 和setCurrentBlockState()。
[protected]
int QSyntaxHighlighter::previousBlockState() const
返回语法高亮显示当前文本块之前文本块的结束状态。如果之前未设置任何值,则返回值为-1。
另请参阅 highlightBlock() 和setCurrentBlockState()。
[slot]
void QSyntaxHighlighter::rehighlight()
将高亮重新应用于整个文档。
另请参阅 rehighlightBlock()。
[slot]
void QSyntaxHighlighter::rehighlightBlock(const QTextBlock &block)
将高亮重新应用于给定的QTextBlock block 。
另请参阅 rehighlight() 。
[protected]
void QSyntaxHighlighter::setCurrentBlockState(int newState)
将当前文本块的状态设置为newState 。
另请参阅 currentBlockState() 和highlightBlock()。
[protected]
void QSyntaxHighlighter::setCurrentBlockUserData(QTextBlockUserData *data)
将给定的data 附加到当前文本块。所有权将传递给底层文本文档,也就是说,如果相应的文本块被删除,所提供的QTextBlockUserData 对象也将被删除。
QTextBlockUserData 可用于存储自定义设置。在语法高亮的情况下,它尤其可以作为缓存存储在解析段落文本时可能发现的信息。
例如,在解析文本时,可以跟踪遇到的括号字符('{[[('等),并将它们的相对位置和实际的QChar 保存在一个派生自QTextBlockUserData 的简单类中:
struct ParenthesisInfo { QChar character; int position; }; struct BlockData : public QTextBlockUserData { QList<ParenthesisInfo> parentheses; };
在相关编辑器中进行光标导航时,可以询问当前QTextBlock (使用QTextCursor::block() 函数获取)是否设置了用户数据对象,并将其转换为BlockData
对象。然后,您可以检查当前光标位置是否与之前记录的括号位置相匹配,并根据括号的类型(开括号或闭括号),查找同层的下一个开括号或闭括号。
这样,您就可以进行可视化的括号匹配,并突出显示从当前光标位置到匹配括号的位置。这样,在编辑括号密集的代码时,就能更容易地发现代码中缺少的括号,并找到相应的开括号/闭括号。
另请参见 currentBlockUserData() 和QTextBlock::setUserData()。
void QSyntaxHighlighter::setDocument(QTextDocument *doc)
在给定的QTextDocument doc 上安装语法高亮器。QSyntaxHighlighter 一次只能用于一个文档。
另请参阅 document() 。
[protected]
void QSyntaxHighlighter::setFormat(int start, int count, const QTextCharFormat &format)
该函数应用于语法高亮程序的当前文本块(即传递给highlightBlock() 函数的文本)。
指定的format 将应用于从start 位置开始的文本,长度为count 字符(如果count 为 0,则不执行任何操作)。format 中设置的格式属性会在显示时与直接存储在文档中的格式信息合并,例如之前用QTextCursor 函数设置的格式信息。请注意,通过该函数设置的格式不会对文档本身造成任何修改。
另请参阅 format() 和highlightBlock()。
[protected]
void QSyntaxHighlighter::setFormat(int start, int count, const QColor &color)
这是一个重载函数。
指定的color 将从start 位置开始应用于当前文本块,长度为count 字符。
当前文本块的其他属性(如字体和背景颜色)将重置为默认值。
另请参阅 format() 和highlightBlock()。
[protected]
void QSyntaxHighlighter::setFormat(int start, int count, const QFont &font)
这是一个重载函数。
指定的font 将从start 位置开始应用于当前文本块,长度为count 字符。
当前文本块的其他属性(如字体和背景颜色)将重置为默认值。
另请参阅 format() 和highlightBlock()。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.