class QSyntaxHighlighter#

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

Inheritance diagram of PySide6.QtGui.QSyntaxHighlighter

概述#

方法#

虚方法#

槽位#

注意

本文档可能包含自动从C++转换为Python的代码片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译有问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE上创建工单来告诉我们

详细描述#

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

QSyntaxHighlighter 类是用于实现 QTextDocument 语法高亮器的基类。语法高亮器会自动高亮 QTextDocument 中的文本部分。语法高亮器常用于用户在特定格式(例如源代码)中输入文本时,并有助于用户阅读文本和识别语法错误。

要提供自己的语法高亮,您必须创建 QSyntaxHighlighter 的子类,并重新实现 highlightBlock() 方法。

当您创建您自己的 QSyntaxHighlighter 子类的实例时,您需要传递要对其应用语法高亮的 QTextDocument 。例如:

editor = QTextEdit()
highlighter = MyHighlighter(editor.document())

在此之后,您的 highlightBlock() 函数将在必要时自动调用。您可以使用 highlightBlock() 函数向其传递的文本应用格式(例如设置字体和颜色)。QSyntaxHighlighter 提供 setFormat() 函数,将给定的 QTextCharFormat 应用到当前的文本块。例如:

def highlightBlock(self, text):

    myClassFormat = QTextCharFormat()
    myClassFormat.setFontWeight(QFont.Bold)
    myClassFormat.setForeground(Qt.darkMagenta)
    expression = QRegularExpression("\\bMy[A-Za-z]+\\b")
    i = expression.globalMatch(text)
    while i.hasNext():
        match = i.next()
        setFormat(match.capturedStart(), match.capturedLength(), myClassFormat)

某些语法可以跨越多个文本块的结构。例如,C++语法高亮器应该能够处理多行注释(/ * ... */)。为了处理这些情况,需要知道前一个文本块的结束状态(例如,“处于注释中”)。

在您的 highlightBlock() 实现中,您可以使用 previousBlockState() 函数查询前一个文本块的结束状态。解析块后,您可以使用 setCurrentBlockState() 函数保存最后一个状态。

currentBlockState()previousBlockState() 函数返回一个整数值。如果没有设置状态,返回值是 -1。您可以使用 setCurrentBlockState() 函数指定其他任何值来识别任何给定的状态。一旦设置了状态,QTextBlock 会保留该值,直到再次设置或相应段落文本被删除。

例如,如果您正在编写一个简单的 C++ 语法高亮器,您可以指定 1 来表示“在注释中”

multiLineCommentFormat = QTextCharFormat()
multiLineCommentFormat.setForeground(Qt.red)
startExpression = QRegularExpression("/\\*")
endExpression = QRegularExpression("\\*/")
setCurrentBlockState(0)
startIndex = 0
if previousBlockState() != 1:
    startIndex = text.indexOf(startExpression)
while startIndex >= 0:
    endMatch = QRegularExpressionMatch()
    endIndex = text.indexOf(endExpression, startIndex, endMatch)
    commentLength = int()
    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 Syntax Highlighter Example

__init__(parent)#
参数:

parentQTextDocument

创建一个 QSyntaxHighlighter 并将其安装在 parent 上。指定的 QTextDocument 也成为 QSyntaxHighlighter 的所有者。

__init__(parent)
参数:

parentQObject

使用给定的 parent 创建一个 QSyntaxHighlighter

如果父对象是 QTextEdit,则将语法高亮器安装在其父文档上。指定的 QTextEdit 也成为 QSyntaxHighlighter 的所有者。

currentBlock()#
返回类型:

QTextBlock

返回当前文本块。

currentBlockState()#
返回类型:

int

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

另请参见

setCurrentBlockState()

currentBlockUserData()#
返回类型:

QTextBlockUserData

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

document()#
返回类型:

QTextDocument

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

另请参见

setDocument()

format(pos)#
参数:

pos – int

返回类型:

QTextCharFormat

在语法高亮器当前文本块中返回指定位置的格式。

另请参见

setFormat()

抽象highlightBlock(text)#
参数:

text - 字符串

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

高亮显示给定的文本块。此函数由富文本引擎在必要时调用,即文本块发生更改时。

要提供自己的语法高亮,必须子类化 QSyntaxHighlighter 并重新实现 highlightBlock() 方法。在你的实现中,你应该解析块的 text 并根据需要调用 setFormat() 以应用您所需的任何字体和颜色更改。例如

def highlightBlock(self, text):

    myClassFormat = QTextCharFormat()
    myClassFormat.setFontWeight(QFont.Bold)
    myClassFormat.setForeground(Qt.darkMagenta)
    expression = QRegularExpression("\\bMy[A-Za-z]+\\b")
    i = expression.globalMatch(text)
    while i.hasNext():
        match = i.next()
        setFormat(match.capturedStart(), match.capturedLength(), myClassFormat)

查看 详细描述 了解使用 setCurrentBlockState()currentBlockState()previousBlockState() 以处理跨越多个文本块的语法结构

previousBlockState()#
返回类型:

int

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

rehighlight()#

重新应用于整篇文档的着色。

另请参见

rehighlightBlock()

rehighlightBlock(block)#
参数:

blockQTextBlock

重新应用于给定 QTextBlock 的着色。

另请参见

rehighlight()

setCurrentBlockState(newState)#
参数:

newState – int

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

setCurrentBlockUserData(data)#
参数:

dataQTextBlockUserData

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

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

QTextBlockUserData 可用于存储自定义设置。在语法高亮的情况下,它特别有趣,可以作为在分析段文本时可能发现的信息的缓存存储。

例如,在分析文本时,可以跟踪你遇到的括号字符(如“{[(”等),并将它们的相对位置和实际的 QChar 存储在一个从 QTextBlockUserData 派生出的简单类中。

class ParenthesisInfo():

    character = QChar()
    position = int()

class BlockData(QTextBlockUserData):

parentheses = QList()

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

这样,您可以对括号进行视觉匹配,并从当前光标位置高亮显示到匹配的括号。这使得在代码中发现缺少的括号以及编辑大量使用括号的代码时找到相应的开/闭括号变得更容易。

setDocument(doc)#
参数:

docQTextDocument

在指定的 QTextDocument doc 上安装语法高亮器。一次只能使用一个 QSyntaxHighlighter

另请参见

document()

setFormat(start, count, color)#
参数:
  • start – 整数

  • count – 整数

  • colorQColor

这是一个重载函数。

将指定的 color 应用到从 start 位置开始的当前文本块,长度为 count 个字符。

当前文本块的其它属性,例如字体和背景颜色,将重置为默认值。

另请参见

format() highlightBlock()

setFormat(start, count, font)
参数:
  • start – 整数

  • count – 整数

  • fontQFont

这是一个重载函数。

将指定的 font 应用到从 start 位置开始的当前文本块,长度为 count 个字符。

当前文本块的其它属性,例如字体和背景颜色,将重置为默认值。

另请参见

format() highlightBlock()

setFormatstart , count , format )
参数:

该函数应用于语法高亮器当前的文本块(即传递给 highlightBlock() 函数的文本)。

指定的格式应用于从起始位置开始,长度为count个字符的文本(如果count为0,则不做任何操作)。在format中设置的格式属性在显示时与文档中直接存储的格式信息合并,例如之前通过QTextCursor的函数设置。请注意,通过此函数设置的格式本身不会修改文档。

另请参见

format() highlightBlock()