Home · All Classes · Modules  · QSS HELP  · QSS 案例 · VER007 HOME

QSyntaxHighlighter Class Reference
[QtGui module]

该QSyntaxHighlighter类允许你定义语法高亮规则,除了可以使用类来查询文档的当前格式或用户数据。More...

继承QObject

Methods


Detailed Description

该QSyntaxHighlighter类允许你定义语法高亮规则,除了可以使用类来查询文档的当前格式或用户数据。

该QSyntaxHighlighter类是实现一个基类QTextEdit语法荧光笔。语法highligher自动突出显示文本的部分在QTextEdit,或更一般地在一个QTextDocument。当用户以特定的格式(例如源代码)输入文字,并帮助用户读取文本并识别语法错误语法荧光笔经常被使用。

提供自己的语法高亮,你必须继承QSyntaxHighlighter和重新实现highlightBlock( ) 。

当您创建您的QSyntaxHighlighter子类的实例,传递给它QTextEdit or QTextDocument您想要的语法高亮被应用到。例如:

 QTextEdit *editor = new QTextEdit;
 MyHighlighter *highlighter = new MyHighlighter(editor->document());

在此之后你highlightBlock( )函数将自动被调用时必要的。使用您的highlightBlock( )函数(如设置字体和颜色)套用格式来传递给它的文本。 QSyntaxHighlighter提供setFormat()函数,它适用于一个给定的QTextCharFormat对当前文本块。例如:

 void MyHighlighter.highlightBlock(const QString &text)
 {
     QTextCharFormat myClassFormat;
     myClassFormat.setFontWeight(QFont.Bold);
     myClassFormat.setForeground(Qt.darkMagenta);
     QString pattern = "\\bMy[A-Za-z]+\\b";

     QRegExp expression(pattern);
     int index = text.indexOf(expression);
     while (index >= 0) {
         int length = expression.matchedLength();
         setFormat(index, length, myClassFormat);
         index = text.indexOf(expression, index + length);
     }
 }

一些语法可以跨越数个文字块结构。例如,一个C + +的语法高亮显示应该能够应付/*...*/多行注释。为了应对这些情况下,有必要知道以前的文本块的结束状态(例如“在注释” ) 。

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

currentBlockState()和previousBlockState( )函数返回一个int值。如果没有状态设置,返回值为-1 。您可以指定任何其他值使用,以确定任何给定的状态setCurrentBlockState()函数。一旦状态被设定在QTextBlock保持该值直到它被设置重新设置或直到文本的相应段落被删除。

例如,如果你正在写一个简单的C + +语法高亮,你可能会指定1来表示“在注释” :

 QTextCharFormat multiLineCommentFormat;
 multiLineCommentFormat.setForeground(Qt.red);

 QRegExp startExpression("/\\*");
 QRegExp endExpression("\\*/");

 setCurrentBlockState(0);

 int startIndex = 0;
 if (previousBlockState() != 1)
     startIndex = text.indexOf(startExpression);

 while (startIndex >= 0) {
    int endIndex = text.indexOf(endExpression, startIndex);
    int commentLength;
    if (endIndex == -1) {
        setCurrentBlockState(1);
        commentLength = text.length() - startIndex;
    } else {
        commentLength = endIndex - startIndex
                        + endExpression.matchedLength();
    }
    setFormat(startIndex, commentLength, multiLineCommentFormat);
    startIndex = text.indexOf(startExpression,
                              startIndex + commentLength);
 }

在上面的例子中,我们首先设置当前块的状态为0。然后,如果前面的程序段中的注释结束,我们从当前块的开头higlight (startIndex = 0) 。否则,我们搜索给定的起始表达。如果指定的结束表达式不能在文本块中被发现,我们通过调用改变当前块的状态setCurrentBlockState( ) ,并确保该块的其馀部分是higlighted 。

此外,您可以使用查询当前格式和用户数据format()和currentBlockUserData( )分别为功能。您还可以将用户的数据使用附加到当前文本块setCurrentBlockUserData()函数。QTextBlockUserData可以用来存储自定义设置。在语法高亮的情况下,特别是有趣的,因为缓存中存储的信息,你可以找出在分析段落的文字。有关示例,请参见setCurrentBlockUserData( )的文档。


Method Documentation

QSyntaxHighlighter.__init__ (self, QTextEdit parent)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个QSyntaxHighlighter用给定的parent

QSyntaxHighlighter.__init__ (self, QTextDocument parent)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个QSyntaxHighlighter并在安装它parent。指定QTextDocument也成为了车主QSyntaxHighlighter

QSyntaxHighlighter.__init__ (self, QObject parent)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个QSyntaxHighlighter并在安装它parentQTextDocument。指定QTextEdit也成为了车主QSyntaxHighlighter

QTextBlock QSyntaxHighlighter.currentBlock (self)

返回当前文本块。

此功能被引入Qt的4.4 。

int QSyntaxHighlighter.currentBlockState (self)

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

See also setCurrentBlockState( ) 。

QTextBlockUserData QSyntaxHighlighter.currentBlockUserData (self)

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

See also QTextBlock.userData()和setCurrentBlockUserData( ) 。

QTextDocument QSyntaxHighlighter.document (self)

返回QTextDocument在这本语法高亮显示已安装。

See also setDocument( ) 。

QTextCharFormat QSyntaxHighlighter.format (self, int pos)

返回格式,position里面的语法高亮显示当前的文本块。

See also setFormat( ) 。

QSyntaxHighlighter.highlightBlock (self, QString text)

这种方法是抽象的,应在任何子类中重新实现。

亮点给定的文本块。这个功能是由富文本引擎在必要时调用,即对已改变的文本块。

提供自己的语法高亮,你必须继承QSyntaxHighlighter并重新实现highlightBlock ( ) 。在你重新实现,你应该分析该区块的text和呼叫setFormat()视需要来应用你需要的任何字体和颜色的变化。例如:

 void MyHighlighter.highlightBlock(const QString &text)
 {
     QTextCharFormat myClassFormat;
     myClassFormat.setFontWeight(QFont.Bold);
     myClassFormat.setForeground(Qt.darkMagenta);
     QString pattern = "\\bMy[A-Za-z]+\\b";

     QRegExp expression(pattern);
     int index = text.indexOf(expression);
     while (index >= 0) {
         int length = expression.matchedLength();
         setFormat(index, length, myClassFormat);
         index = text.indexOf(expression, index + length);
      }
  }

一些语法可以跨越数个文字块结构。例如,一个C + +的语法高亮显示应该能够应付/*...*/多行注释。为了应对这些情况下,有必要知道以前的文本块的结束状态(例如“在注释” ) 。

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

currentBlockState()和previousBlockState( )函数返回一个int值。如果没有状态设置,返回值为-1 。您可以指定任何其他值使用,以确定任何给定的状态setCurrentBlockState()函数。一旦状态被设定在QTextBlock保持该值直到它被设置重新设置或直到文本的相应段落被删除。

例如,如果你正在写一个简单的C + +语法高亮,你可能会指定1来表示“在注释” 。对于结束的评论最好设置1使用setCurrentBlockState的中间,和其他几款最好设置0文本块。在你的解析代码,如果返回值previousBlockState()是1 ,你,直到你达到收盘突出显示文本作为一个C + +注释*/

See also previousBlockState( )setFormat()和setCurrentBlockState( ) 。

int QSyntaxHighlighter.previousBlockState (self)

返回文本块的结尾状态前,以语法高亮显示的当前块。如果先前未设置任何值,则返回值为-1 。

See also highlightBlock()和setCurrentBlockState( ) 。

QSyntaxHighlighter.rehighlight (self)

这种方法也是一个Qt槽与C + +的签名void rehighlight()

重新应用突出显示整个文档。

这个函数中引入了Qt 4.2中。

See also rehighlightBlock( ) 。

QSyntaxHighlighter.rehighlightBlock (self, QTextBlock block)

这种方法也是一个Qt槽与C + +的签名void rehighlightBlock(const QTextBlock&)

重新应用突出显示给定的QTextBlock block

此功能被引入Qt的4.6 。

See also rehighlight( ) 。

QSyntaxHighlighter.setCurrentBlockState (self, int newState)

设置当前文本块的状态newState

See also currentBlockState()和highlightBlock( ) 。

QSyntaxHighlighter.setCurrentBlockUserData (self, QTextBlockUserData data)

重视给定的data以目前的文本块。所有权被传递到下面的文本文件,即提供QTextBlockUserData如果相应的文本块被删除的对象将被删除。

QTextBlockUserData可以用来存储自定义设置。在语法高亮的情况下,特别是有趣的,因为缓存中存储的信息,你可以找出在分析段落的文字。

例如在解析文本,你可以保持您遇到的( ' { [ ('之类的)括号字符轨道,并存储它们的相对位置和实际QChar在源自一个简单的类QTextBlockUserData

 struct ParenthesisInfo
 {
     QChar char;
     int position;
 };

 struct BlockData : public QTextBlockUserData
 {
     QVector<ParenthesisInfo> parentheses;
 };

期间,在相关编辑器的光标导航,你可以问当前QTextBlock(使用检索到的QTextCursor.block( )函数),如果它有一个用户数据对象集,并将其转换为你的BlockData对象。然后,您可以检查当前光标位置与先前录制的括号位置相匹配,并根据括号(打开或关闭)的类型,找到同一级别的下一个左或右括号。

通过这种方式,你可以做一个直观的括号匹配和高亮显示从当前光标位置到匹配的括号。这使得它更容易发现缺少括号中的代码,并寻找到对应的打开/关闭括号编辑括号密集型代码的时候。

See also currentBlockUserData()和QTextBlock.setUserData( ) 。

QSyntaxHighlighter.setDocument (self, QTextDocument doc)

安装语法高亮在给定的QTextDocument doc。一QSyntaxHighlighter只能用于同一个文档的时间。

See also document( ) 。

QSyntaxHighlighter.setFormat (self, int start, int count, QTextCharFormat format)

此功能适用于语法高亮显示当前的文本块(即传递给文本highlightBlock()函数) 。

指定format从应用到文本start对的长度位置count字符(如果count是0 ,没有采取任何措施) 。在设置的格式属性format被合并在显示时间直接存储在文档中的格式信息,例如先前设置QTextCursor的功能。需要注意的是文件本身并没有发生变化,通过这个功能设置的格式。

See also format()和highlightBlock( ) 。

QSyntaxHighlighter.setFormat (self, int start, int count, QColor color)

这是一个重载函数。

指定color从应用于当前文本块start对的长度位置count字符。

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

See also format()和highlightBlock( ) 。

QSyntaxHighlighter.setFormat (self, int start, int count, QFont font)

这是一个重载函数。

指定font从应用于当前文本块start对的长度位置count字符。

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

See also format()和highlightBlock( ) 。




PyQt 4.10.3 for X11 Copyright © Riverbank Computing Ltd and Nokia 2012 Qt 4.8.5