论坛首页 编程语言技术论坛

pyqt的语法高亮实现(译)

浏览 6241 次
精华帖 (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
  • 大小: 10.7 KB
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics