- class QSyntaxHighlighter#
QSyntaxHighlighter
类允许你定义语法高亮规则,此外你还可以使用该类查询文档当前格式或用户数据。更多…概述#
方法#
def
__init__()
def
currentBlock()
def
document()
def
format()
def
setDocument()
def
setFormat()
虚方法#
def
highlightBlock()
槽位#
注意
本文档可能包含自动从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)#
- 参数:
parent –
QTextDocument
创建一个
QSyntaxHighlighter
并将其安装在parent
上。指定的QTextDocument
也成为QSyntaxHighlighter
的所有者。- __init__(parent)
- 参数:
parent –
QObject
使用给定的
parent
创建一个QSyntaxHighlighter
。如果父对象是 QTextEdit,则将语法高亮器安装在其父文档上。指定的 QTextEdit 也成为
QSyntaxHighlighter
的所有者。- currentBlock()#
- 返回类型:
返回当前文本块。
- currentBlockState()#
- 返回类型:
int
返回当前文本块的状态。如果没有设置值,则返回值为 -1。
- currentBlockUserData()#
- 返回类型:
返回之前附加到当前文本块的
QTextBlockUserData
对象。- document()#
- 返回类型:
返回安装有此语法高亮器的
QTextDocument
。另请参见
- format(pos)#
- 参数:
pos – int
- 返回类型:
在语法高亮器当前文本块中返回指定位置的格式。
另请参见
- 抽象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(block)#
- 参数:
block –
QTextBlock
重新应用于给定
QTextBlock
块
的着色。另请参见
- setCurrentBlockState(newState)#
- 参数:
newState – int
将当前文本块的状态设置为
newState
。- setCurrentBlockUserData(data)#
- 参数:
data –
QTextBlockUserData
警告
本节包含自动从C++转换为Python的代码片段,可能包含错误。
将所提供的
data
附加到当前文本块。所有权传递给底层文本文档,即在相关文本块被删除时,提供的QTextBlockUserData
对象将被删除。QTextBlockUserData
可用于存储自定义设置。在语法高亮的情况下,它特别有趣,可以作为在分析段文本时可能发现的信息的缓存存储。例如,在分析文本时,可以跟踪你遇到的括号字符(如“{[(”等),并将它们的相对位置和实际的 QChar 存储在一个从
QTextBlockUserData
派生出的简单类中。class ParenthesisInfo(): character = QChar() position = int() class BlockData(QTextBlockUserData): parentheses = QList()
在相关编辑器中的光标导航期间,您可以询问当前
QTextBlock
是否设置了用户数据对象(使用block()
函数检索),并将其强制转换为您的BlockData
对象。然后,您可以检查当前光标位置是否匹配先前记录的括号位置,并根据括号的类型(开括号或闭括号),在同一级别上找到下一个开括号或闭括号。这样,您可以对括号进行视觉匹配,并从当前光标位置高亮显示到匹配的括号。这使得在代码中发现缺少的括号以及编辑大量使用括号的代码时找到相应的开/闭括号变得更容易。
- setDocument(doc)#
- 参数:
doc –
QTextDocument
在指定的
QTextDocument
doc
上安装语法高亮器。一次只能使用一个QSyntaxHighlighter
。另请参见
这是一个重载函数。
将指定的
color
应用到从start
位置开始的当前文本块,长度为count
个字符。当前文本块的其它属性,例如字体和背景颜色,将重置为默认值。
另请参见
- setFormat(start, count, font)
- 参数:
start – 整数
count – 整数
font –
QFont
这是一个重载函数。
将指定的
font
应用到从start
位置开始的当前文本块,长度为count
个字符。当前文本块的其它属性,例如字体和背景颜色,将重置为默认值。
另请参见
- setFormatstart , count , format )
- 参数:
start – 整数
count – 整数
format –
QTextCharFormat
该函数应用于语法高亮器当前的文本块(即传递给
highlightBlock()
函数的文本)。指定的
格式
应用于从起始
位置开始,长度为count
个字符的文本(如果count
为0,则不做任何操作)。在format
中设置的格式属性在显示时与文档中直接存储的格式信息合并,例如之前通过QTextCursor
的函数设置。请注意,通过此函数设置的格式本身不会修改文档。另请参见