PySide6.QtGui.QSyntaxHighlighter

class QSyntaxHighlighter

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

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 语法 高亮 示例

__init__(parent)
Parameters:

父对象QObject

使用给定的parent构造一个QSyntaxHighlighter

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

__init__(parent)
Parameters:

父级QTextDocument

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

currentBlock()
Return type:

QTextBlock

返回当前的文本块。

currentBlockState()
Return type:

整数

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

另请参阅

setCurrentBlockState()

currentBlockUserData()
Return type:

QTextBlockUserData

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

document()
Return type:

QTextDocument

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

另请参阅

setDocument()

format(pos)
Parameters:

pos – 整数

Return type:

QTextCharFormat

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

另请参阅

setFormat()

abstract highlightBlock(text)
Parameters:

文本 – str

警告

本节包含从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()
Return type:

整数

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

rehighlight()

重新将高亮应用于整个文档。

另请参阅

rehighlightBlock()

rehighlightBlock(block)
Parameters:

QTextBlock

重新应用高亮显示到给定的 QTextBlock block

另请参阅

rehighlight()

setCurrentBlockState(newState)
Parameters:

newState – int

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

setCurrentBlockUserData(data)
Parameters:

数据QTextBlockUserData

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

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

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

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

class ParenthesisInfo():

    character = QChar()
    position = int()

class BlockData(QTextBlockUserData):

parentheses = QList()

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

通过这种方式,您可以从当前光标位置到匹配的括号进行可视化的括号匹配和高亮显示。这使得在代码中更容易发现缺失的括号,并在编辑括号密集的代码时找到相应的开/闭括号位置。

setDocument(doc)
Parameters:

文档QTextDocument

在给定的QTextDocument doc上安装语法高亮器。一个QSyntaxHighlighter一次只能用于一个文档。

另请参阅

document()

setFormat(start, count, color)
Parameters:
  • start – int

  • count – int

  • 颜色QColor

这是一个重载函数。

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

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

另请参阅

format() highlightBlock()

setFormat(start, count, font)
Parameters:
  • start – int

  • count – int

  • 字体QFont

这是一个重载函数。

指定的fontstart位置开始应用于当前文本块,长度为count个字符。

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

另请参阅

format() highlightBlock()

setFormat(start, count, format)
Parameters:

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

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

另请参阅

format() highlightBlock()