[PyQt] Problem with colors and QSciScintilla

projetmbc projetmbc at club-internet.fr
Sun Jul 12 22:12:57 BST 2009


Your example is great. Easy to understand.  Thanks a lot !  :-)

With this, I could start to study how to do more sophisticated things 
like folding.

Christophe an happy man. :-D

Baz Walter a écrit :
> >> I hope that someone can help me.
> >>
> >> Best regards.
> >> Christophe
>
> hello christophe
>
> here's a basic line-based custom lexer that should get you started:
>
>
> import sys
> from PyQt4 import QtCore, QtGui, Qsci
>
>
> class MainWindow(QtGui.QMainWindow):
>     def __init__(self):
>         QtGui.QMainWindow.__init__(self)
>         self.setWindowTitle('Custom Lexer Example')
>         self.setGeometry(QtCore.QRect(50,200,400,400))
>         self.editor = Qsci.QsciScintilla(self)
>         self.editor.setUtf8(True)
>         self.editor.setMarginWidth(2, 15)
>         self.editor.setFolding(True)
>         self.setCentralWidget(self.editor)
>         self.lexer = CustomLexer(self.editor)
>         self.editor.setLexer(self.lexer)
>         self.editor.setText('\n# sample source\n\nfoo = 1\nbar = 2\n')
>
>
> class CustomLexer(Qsci.QsciLexerCustom):
>     def __init__(self, parent):
>         Qsci.QsciLexerCustom.__init__(self, parent)
>         self._styles = {
>             0: 'Default',
>             1: 'Comment',
>             2: 'Key',
>             3: 'Assignment',
>             4: 'Value',
>             }
>         for key,value in self._styles.iteritems():
>             setattr(self, value, key)
>
>     def description(self, style):
>         return self._styles.get(style, '')
>
>     def defaultColor(self, style):
>         if style == self.Default:
>             return QtGui.QColor('#000000')
>         elif style == self.Comment:
>             return QtGui.QColor('#C0C0C0')
>         elif style == self.Key:
>             return QtGui.QColor('#0000CC')
>         elif style == self.Assignment:
>             return QtGui.QColor('#CC0000')
>         elif style == self.Value:
>             return QtGui.QColor('#00CC00')
>         return Qsci.QsciLexerCustom.defaultColor(self, style)
>
>     def styleText(self, start, end):
>         editor = self.editor()
>         if editor is None:
>             return
>
>         # scintilla works with encoded bytes, not decoded characters.
>         # this matters if the source contains non-ascii characters and
>         # a multi-byte encoding is used (e.g. utf-8)
>         source = ''
>         if end > editor.length():
>             end = editor.length()
>         if end > start:
>             if sys.hexversion >= 0x02060000:
>                 # faster when styling big files, but needs python 2.6
>                 source = bytearray(end - start)
>                 editor.SendScintilla(
>                     editor.SCI_GETTEXTRANGE, start, end, source)
>             else:
>                 source = unicode(editor.text()
>                                 ).encode('utf-8')[start:end]
>         if not source:
>             return
>
>         # the line index will also be needed to implement folding
>         index = editor.SendScintilla(editor.SCI_LINEFROMPOSITION, start)
>         if index > 0:
>             # the previous state may be needed for multi-line styling
>             pos = editor.SendScintilla(
>                       editor.SCI_GETLINEENDPOSITION, index - 1)
>             state = editor.SendScintilla(editor.SCI_GETSTYLEAT, pos)
>         else:
>             state = self.Default
>
>         set_style = self.setStyling
>         self.startStyling(start, 0x1f)
>
>         # scintilla always asks to style whole lines
>         for line in source.splitlines(True):
>             length = len(line)
>             if line.startswith('#'):
>                 state = self.Comment
>             else:
>                 # the following will style lines like "x = 0"
>                 pos = line.find('=')
>                 if pos > 0:
>                     set_style(pos, self.Key)
>                     set_style(1, self.Assignment)
>                     length = length - pos - 1
>                     state = self.Value
>                 else:
>                     state = self.Default
>             set_style(length, state)
>             # folding implementation goes here
>             index += 1
>
>
> if __name__ == "__main__":
>     app = QtGui.QApplication(sys.argv)
>     app.connect(app, QtCore.SIGNAL('lastWindowClosed()'),
>                 QtCore.SLOT('quit()'))
>     win = MainWindow()
>     win.show()
>     sys.exit(app.exec_())
>
>




More information about the PyQt mailing list