Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2009 09:57:26

keysod
От:
Зарегистрирован: 2009-09-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

QSyntaxHighlighter - как использовать?

Здравствуйте!

Нужно подсветить код в QTextEdit с помощью QSyntaxHighlighter. Сколько искал, внятного примера так и не нашел:(
не подскажете как это сделать? если не сложно, то с примером кода.

Заранее спасибо!



Офлайн

#2 Сен. 6, 2009 10:04:51

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

QSyntaxHighlighter - как использовать?

читайте документацию. там написано, что вы должны написать свою функцию highlightBlock которая будет делать раскраску. Автоматом QSyntaxHighlighter синтаксисы не понимает.

В QBzr (GUI для bzr на основе Qt) мы используем стороннюю библиотеку Pygments для раскраски.



Офлайн

#3 Окт. 6, 2009 01:34:28

villager
От:
Зарегистрирован: 2008-11-04
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

QSyntaxHighlighter - как использовать?

хотя много времени прошло, но вот пример, правда на основе QPlainTextEdit

class MyProgEdit(QPlainTextEdit):
lastBGcolor=None
MainScreen=None
class PythonHighlighter(QSyntaxHighlighter):
Rules = []
def __init__(self, parent=None):
super(MyProgEdit.PythonHighlighter, self).__init__(parent)
keywordFormat = QTextCharFormat()
keywordFormat.setForeground(Qt.darkBlue)
keywordFormat.setFontWeight(QFont.Bold)
for pattern in ((r"\band\b", r"\bas\b", r"\bassert\b",
r"\bbreak\b", r"\bclass\b", r"\bcontinue\b",
r"\bdef\b", r"\bdel\b", r"\belif\b", r"\belse\b",
r"\bexcept\b", r"\bexec\b", r"\bfinally\b", r"\bfor\b",
r"\bfrom\b", r"\bglobal\b", r"\bif\b", r"\bimport\b",
r"\bin\b", r"\bis\b", r"\blambda\b", r"\bnot\b",
r"\bor\b", r"\bpass\b", r"\bprint\b", r"\braise\b",
r"\breturn\b", r"\btry\b", r"\bwhile\b", r"\bwith\b",
r"\byield\b")):
MyProgEdit.PythonHighlighter.Rules.append((QRegExp(pattern),
keywordFormat))
commentFormat = QTextCharFormat()
commentFormat.setForeground(Qt.darkGreen)
commentFormat.setFontItalic(True)
MyProgEdit.PythonHighlighter.Rules.append((QRegExp(r"#.*"),
commentFormat))
self.stringFormat = QTextCharFormat()
self.stringFormat.setForeground(Qt.red)
stringRe = QRegExp(r"""(?:'[^']*'|"[^"]*")""")
stringRe.setMinimal(True)
MyProgEdit.PythonHighlighter.Rules.append((stringRe, self.stringFormat))
self.stringRe = QRegExp(r"""(:?"["]".*"["]"|'''.*''')""")
self.stringRe.setMinimal(True)
MyProgEdit.PythonHighlighter.Rules.append((self.stringRe,
self.stringFormat))
self.tripleSingleRe = QRegExp(r"""'''(?!")""")
self.tripleDoubleRe = QRegExp(r'''"""(?!')''')


def highlightBlock(self, text):
NORMAL, TRIPLESINGLE, TRIPLEDOUBLE = range(3)

for regex, format in MyProgEdit.PythonHighlighter.Rules:
i = text.indexOf(regex)
while i >= 0:
length = regex.matchedLength()
self.setFormat(i, length, format)
i = text.indexOf(regex, i + length)

self.setCurrentBlockState(NORMAL)
if text.indexOf(self.stringRe) != -1:
return
for i, state in ((text.indexOf(self.tripleSingleRe),
TRIPLESINGLE),
(text.indexOf(self.tripleDoubleRe),
TRIPLEDOUBLE)):
if self.previousBlockState() == state:
if i == -1:
i = text.length()
self.setCurrentBlockState(state)
self.setFormat(0, i + 3, self.stringFormat)
elif i > -1:
self.setCurrentBlockState(state)
self.setFormat(i, text.length(), self.stringFormat)
def __init__(self, txt):
QPlainTextEdit.__init__(self, txt)
font = QFont("Courier New", 10)
font.setFixedPitch(True)
self.setFont(font)
self.highlighter = MyProgEdit.PythonHighlighter(self.document())
self.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding )
def text(self):
return self.toPlainText()
def event(self, event):
if event.type() == QEvent.KeyPress and \
event.key() == Qt.Key_Tab:
cursor = self.textCursor()
cursor.insertText(" ")
return True
return QPlainTextEdit.event(self, event)
def setText(self, text):
self.setPlainText(text)
def focusInEvent(self, ev):
QPlainTextEdit.focusInEvent(self, ev)
if self.lastBGcolor==None: self.lastBGcolor=self.palette().color(QPalette.Base)
palette = QPalette()
palette.setBrush(QPalette.Active, QPalette.Base, QBrush(ActiveBGcolor))
self.setPalette(palette)
def focusOutEvent(self, ev):
QPlainTextEdit.focusOutEvent(self, ev)
if self.lastBGcolor<>None:
palette = QPalette()
palette.setBrush(QPalette.Active, QPalette.Base, QBrush(self.lastBGcolor))
self.setPalette(palette)



Офлайн

#4 Окт. 6, 2009 06:51:42

keysod
От:
Зарегистрирован: 2009-09-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

QSyntaxHighlighter - как использовать?

Спасибо :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version