QSyntaxHighlighter 类

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

头文件 #include <QSyntaxHighlighter>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
继承自 QObject

注意: 此类中的所有函数都是 可重入的

公共函数

QSyntaxHighlighter(QObject *parent)
QSyntaxHighlighter(QTextDocument *parent)
virtual~QSyntaxHighlighter()
QTextDocument *document() const
voidsetDocument(QTextDocument *doc)

公共槽

voidrehighlight()
voidrehighlightBlock(const QTextBlock &block)

受保护函数

QTextBlockcurrentBlock() const
intcurrentBlockState() const
QTextBlockUserData *currentBlockUserData() const
QTextCharFormatformat(int position) const
virtual voidhighlightBlock(const QString &text) = 0
intpreviousBlockState() const
voidsetCurrentBlockState(int newState)
voidsetCurrentBlockUserData(QTextBlockUserData *data)
voidsetFormat(int start, int count, const QTextCharFormat &format)
voidsetFormat(int start, int count, const QColor &color)
voidsetFormat(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() 函数返回一个整数值。如果没有设置状态,返回的值是 -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语法高亮器示例

成员函数文档

[显式构造函数] QSyntaxHighlighter::QSyntaxHighlighter(QObject *parent)

使用指定的 parent 构建 QSyntaxHighlighter。

如果父控件是QTextEdit,它会在父控件的文档上安装语法高亮器。指定的QTextEdit也将成为QSyntaxHighlighter的所有者。

[显式] QSyntaxHighlighter::QSyntaxHighlighter(QTextDocument *parent)

构造一个QSyntaxHighlighter并将其安装到parent上。指定的QTextDocument也将成为QSyntaxHighlighter的所有者。

[虚函数 noexcept] QSyntaxHighlighter::~QSyntaxHighlighter()

析构函数。从文本文档中卸载此语法高亮器。

[受保护] QTextBlock QSyntaxHighlighter::currentBlock() const

返回当前文本块。

[受保护] int QSyntaxHighlighter::currentBlockState() const

返回当前文本块的状态。如果没有设置值,则返回的值是-1。

另见setCurrentBlockState

[受保护] QTextBlockUserData *QSyntaxHighlighter::currentBlockUserData() const

返回先前附加到当前文本块的QTextBlockUserData对象。

另见QTextBlock::userDatasetCurrentBlockUserData

QTextDocument *QSyntaxHighlighter::document() const

返回此语法高亮器安装的QTextDocument

另见setDocument

[受保护] QTextCharFormat QSyntaxHighlighter::format(int position) const

返回语法高亮器当前文本块中position处的格式。

另见setFormat

[纯虚函数受保护] 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);
    }
}

请参阅详细描述,了解使用setCurrentBlockStatecurrentBlockStatepreviousBlockState的示例来处理跨越多个文本块的语法

另见previousBlockStatesetFormatsetCurrentBlockState

[受保护] `int` QSyntaxHighlighter::previousBlockState() const

返回语法高亮器当前文本块之前文本块的结束状态。如果没有先前设置值,则返回值为-1。

另请参阅 highlightBlock() 和 setCurrentBlockState().

[槽函数] `void` QSyntaxHighlighter::rehighlight()

重新对整个文档应用高亮。

另请参阅 rehighlightBlock().

[槽函数] `void` QSyntaxHighlighter::rehighlightBlock(const `QTextBlock` &``block``)

重新对所给的 `QTextBlock ``block`` 应用高亮。

另请参阅 rehighlight().

[受保护] `void` QSyntaxHighlighter::setCurrentBlockState(`int ``newState`)

设置当前文本块的状态为 ``newState`

另请参阅 currentBlockState() 和 highlightBlock().

[受保护] `void` QSyntaxHighlighter::setCurrentBlockUserData(`QTextBlockUserData *``data`)

将所给的 ``data` 附带到当前文本块。所有权传递给底层文本文档,即当相应的文本块被删除时,提供的 `QTextBlockUserData` 对象将被删除。

`QTextBlockUserData` 可以用来存储自定义设置。在语法高亮的情况下,用作在解析段落的文本时可能发现问题信息的缓存存储。

例如,在解析文本时,您可以跟踪遇到的括号字符(如 '{[(' 等),并将它们的相对位置和实际的 `QChar` 保存在从 `QTextBlockUserData` 派生的简单类中。

struct ParenthesisInfo
{
    QChar character;
    int position;
};

struct BlockData : public QTextBlockUserData
{
    QList<ParenthesisInfo> parentheses;
};

在关联编辑器的光标导航期间,您可以使用 `QTextCursor::block()` 函数检索当前的 `QTextBlock`,并将其强制转换为您的 `BlockData` 对象。然后,您可以检查当前光标位置是否与之前记录的括号位置匹配,并根据括号类型(开括号或闭括号)找到同一级别的下一个开括号或闭括号。

通过这种方式,您可以进行视觉上的括号匹配,并从当前光标位置到匹配的括号进行高亮显示。这使得在代码中查找缺失的括号以及编辑带有大量括号的代码时查找相应的开闭括号变得更容易。

另请参阅 currentBlockUserData() 和 QTextBlock::setUserData().

`void` QSyntaxHighlighter::setDocument(`QTextDocument *``doc`)

在给定的 QTextDocument doc 上安装语法高亮显示器。同一个时间只能使用一个 QSyntaxHighlighter

另请参阅 文档

[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

© 2024 Qt公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款提供。Qt及其相关标志是芬兰和/或世界其他国家的Qt公司的商标。所有其他商标均为各自所有者的财产。