浏览 6307 次
锁定老帖子 主题:pyqt的语法高亮实现(译)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-11
最后修改:2010-01-11
这里 。
几个月前我决定为一款软件增加语法高亮显示功能。这个工作仍在进行中。由于它是一个基于PyQt的应用程序,很显然使用QSyntaxHighlighter是不二之选。不幸的是,关于Python这方面的例子并不多,所以我决定自己来实现一个。在这个例子中使用的 Python文件在
要实现语法高亮功能,我们需要继承QSyntaxHighlighter,重新实现highlightBlock功能,并指定一些语法高亮的规则。一般来说,一个规则包含一个QRegExp模式和QTextCharFormat实例。在这个例子中,语法规则基于“R statistical ”编程语言。各种规则可以使用Python list 存储。 import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class MyHighlighter( QSyntaxHighlighter ): def __init__( self, parent, theme ): QSyntaxHighlighter.__init__( self, parent ) self.parent = parent self.highlightingRules = [] keyword = QTextCharFormat() keyword.setForeground( Qt.darkBlue ) keyword.setFontWeight( QFont.Bold ) keywords = QStringList( [ "break", "else", "for", "if", "in", "next", "repeat", "return", "switch", "try", "while" ] ) for word in keywords: pattern = QRegExp("\\b" + word + "\\b") rule = HighlightingRule( pattern, keyword ) self.highlightingRules.append( rule ) MyHighlighter是QSyntaxHighlighter的子类,并包含我们将重新实现的highlightBlock功能。上面的是关键字规则例子,包含了已确认的最常见的ṛ关键字。我们给关键字一个加粗的,深蓝色字体。遍历每个关键字,我们指定关键字以及特定格式的HighlightingRule对象(见附件Python的文件),并追加对象到我们的规则列表中。 我们可以进一步完善语法规则,包括reservedClasses, assignmentOperators, and number reservedClasses = QTextCharFormat() reservedClasses.setForeground( Qt.darkRed ) reservedClasses.setFontWeight( QFont.Bold ) keywords = QStringList( [ "array", "character", "complex", "data.frame", "double", "factor", "function", "integer", "list", "logical", "matrix", "numeric", "vector" ] ) for word in keywords: pattern = QRegExp("\\b" + word + "\\b") rule = HighlightingRule( pattern, reservedClasses ) self.highlightingRules.append( rule ) assignmentOperator = QTextCharFormat() pattern = QRegExp( "(<){1,2}-" ) assignmentOperator.setForeground( Qt.green ) assignmentOperator.setFontWeight( QFont.Bold ) rule = HighlightingRule( pattern, assignmentOperator ) self.highlightingRules.append( rule ) number = QTextCharFormat() pattern = QRegExp( "[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?" ) pattern.setMinimal( True ) number.setForeground( Qt.blue ) rule = HighlightingRule( pattern, number ) self.highlightingRules.append( rule ) 在QSyntaxHighlighter对象创建后,当富文本引擎需要高亮显示给定的文本块时。它的highlightBlock()函数将自动被调用。QSyntaxHighlighter类提供setFormat函数来执行一个实际的格式。指定的格式应用到给定起始位置的文本。给定格式中的格式属性被合并显示,并连同格式信息直接存储在文件中。 def highlightBlock( self, text ): for rule in self.highlightingRules: expression = QRegExp( rule.pattern ) index = expression.indexIn( text ) while index >= 0: length = expression.matchedLength() self.setFormat( index, length, rule.format ) index = text.indexOf( expression, index + length ) self.setCurrentBlockState( 0 ) 这个过程一直重复到所有的模式匹配完成。要适用多个文本块及多行,需要进一步完善逻辑。有关示例,请参阅QSynatxHighlighter文档。 为了给一个QTextEdit应用语法高亮显示,我们简单地创建一个我们的QSyntaxHighlighter子类的实例,如下面的测试应用程序演示: class TestApp( QMainWindow ): def __init__(self): QMainWindow.__init__(self) editor = QTextEdit() highlighter = MyHighlighter( editor ) self.setCentralWidget( editor ) self.setWindowTitle( "Syntax Highlighter Example" ) 原文:Syntax highlighting with PyQt 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |