本页内容

QSyntaxHighlighter Class

QSyntaxHighlighter 类允许您定义语法高亮规则,此外,您还可以使用该类查询文档的当前格式或用户数据。更多内容...

标题: #include <QSyntaxHighlighter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
继承自: QObject

注意:该类中的所有函数均为可重入函数。

公共函数

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);
    }
}

请参阅 `Detailed Description `,了解如何使用 `setCurrentBlockState()`、`currentBlockState()` 和 `previousBlockState()` 来处理包含跨多个文本块结构的语法

另请参阅 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()。

© 2026 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.