2010-04-22 2 views
1

필자의 최종 목표는 PyQt4와 Python 2.6을 사용하여 QsciScintilla에서 Erlang 구문 강조를 얻는 것입니다. Windows 7에서 실행 중이지만 우분투 지원이 필요합니다.내 QsciLexerCustom 하위 클래스가 QsciScintilla를 사용하여 PyQt4에서 작동하지 않는 이유는 무엇입니까?

PyQt4에는 "기본"기호가있는 Erlang 렉서/형광펜에 필요한 래퍼 코드가 없으므로 QsciLexerCustom 위에 경량 문자를 작성한다고 생각했습니다. Qsci 래퍼가 텍스트의 부분 범위를 가져 오거나 설정할 때 시작 오프셋 (offset-from-start)보다는 라인 + 인덱스에 대해 실제로 말하고 싶어하기 때문에 약간 문제가 있습니다. 한편, 렉서는 시작부터 오프셋으로 인수를 얻습니다. 지금은 전체 텍스트 사본을 얻은 다음 적절하게 분할합니다.

다음 렉서가 있는데 setLexer()를 사용하여 적용합니다. 새 파일을 열어 이것을 렉서로 설정하면, 적절한 호출을 얻게되고, 룰러에 따라 적절한 줄이 출력됩니다 ... 그러나 문서에는 스타일이 없습니다. 모든 정의 된 스타일을 빨간색으로 만들려고했는데 문서가 여전히 완고하게 검정색에서 흰색이므로 분명히 스타일이 실제로 "적용되지 않습니다"

내가 뭘 잘못하고 있니? 아무도 모르는 경우, 사람들이 실제로이 사실을 알 수있는 적절한 토론 포럼은 무엇입니까? (그것은 파이썬, Qt와 신틸라 사이의 흥미로운 교차점입니다. 따라서 알 수있는 사람들이 작다고 생각합니다)

prefs.declare()는 주어진 키의 값을 반환하는 dict를 설정한다고 가정 해 봅니다 나는 이것을 확인했다 - 그것은 문제가 아니다. scintilla가 호스트 윈도우 QWidget에 합리적으로 적절히 구성되었다고 가정합시다. 특히 QsciLexerPython과 같은 묶음 렉서를 적용하면 효과가 나타나고 스타일이 적용된 텍스트가 표시됩니다. QsciScintilla 위젯에 적용

prefs.declare('font.name.margin', "MS Dlg") 
prefs.declare('font.size.margin', 8) 
prefs.declare('font.name.code', "Courier New") 
prefs.declare('font.size.code', 10) 
prefs.declare('color.editline', "#d0e0ff") 

class LexerErlang(Qsci.QsciLexerCustom): 
    def __init__(self, obj = None): 
    Qsci.QsciLexerCustom.__init__(self, obj) 
    self.sci = None 
    self.plainFont = QtGui.QFont() 
    self.plainFont.setPointSize(int(prefs.get('font.size.code'))) 
    self.plainFont.setFamily(prefs.get('font.name.code')) 
    self.marginFont = QtGui.QFont() 
    self.marginFont.setPointSize(int(prefs.get('font.size.code'))) 
    self.marginFont.setFamily(prefs.get('font.name.margin')) 
    self.boldFont = QtGui.QFont() 
    self.boldFont.setPointSize(int(prefs.get('font.size.code'))) 
    self.boldFont.setFamily(prefs.get('font.name.code')) 
    self.boldFont.setBold(True) 
    self.styles = [ 
     Qsci.QsciStyle(0, QtCore.QString("base"), QtGui.QColor("#000000"), QtGui.QColor("#ffffff"), self.plainFont, True), 
     Qsci.QsciStyle(1, QtCore.QString("comment"), QtGui.QColor("#008000"), QtGui.QColor("#eeffee"), self.marginFont, True), 
     Qsci.QsciStyle(2, QtCore.QString("keyword"), QtGui.QColor("#000080"), QtGui.QColor("#ffffff"), self.boldFont, True), 
     Qsci.QsciStyle(3, QtCore.QString("string"), QtGui.QColor("#800000"), QtGui.QColor("#ffffff"), self.marginFont, True), 
     Qsci.QsciStyle(4, QtCore.QString("atom"), QtGui.QColor("#008080"), QtGui.QColor("#ffffff"), self.plainFont, True), 
     Qsci.QsciStyle(5, QtCore.QString("macro"), QtGui.QColor("#808000"), QtGui.QColor("#ffffff"), self.boldFont, True), 
     Qsci.QsciStyle(6, QtCore.QString("error"), QtGui.QColor("#000000"), QtGui.QColor("#ffd0d0"), self.plainFont, True), 
    ] 
    print("LexerErlang created") 
    def description(self, ix): 
    for i in self.styles: 
     if i.style() == ix: 
     return QtCore.QString(i.description()) 
    return QtCore.QString("") 
    def setEditor(self, sci): 
    self.sci = sci 
    Qsci.QsciLexerCustom.setEditor(self, sci) 
    print("LexerErlang.setEditor()") 
    def styleText(self, start, end): 
    print("LexerErlang.styleText(%d,%d)" % (start, end)) 
    lines = self.getText(start, end) 
    offset = start 
    self.startStyling(offset, 0) 
    print("startStyling()") 
    for i in lines: 
     if i == "": 
     self.setStyling(1, self.styles[0]) 
     print("setStyling(1)") 
     offset += 1 
     continue 
     if i[0] == '%': 
     self.setStyling(len(i)+1, self.styles[1]) 
     print("setStyling(%)") 
     offset += len(i)+1 
     continue 
     self.setStyling(len(i)+1, self.styles[0]) 
     print("setStyling(n)") 
     offset += len(i)+1 
    def getText(self, start, end): 
    data = self.sci.text() 
    print("LexerErlang.getText(): " + str(len(data)) + " chars") 
    return data[start:end].split('\n') 

다음과 같이 너무 내 문서 창 클래스 내부

_lexers = { 
    'erl': (Q.SCLEX_ERLANG, LexerErlang), 
    'hrl': (Q.SCLEX_ERLANG, LexerErlang), 
    'html': (Q.SCLEX_HTML, Qsci.QsciLexerHTML), 
    'css': (Q.SCLEX_CSS, Qsci.QsciLexerCSS), 
    'py': (Q.SCLEX_PYTHON, Qsci.QsciLexerPython), 
    'php': (Q.SCLEX_PHP, Qsci.QsciLexerHTML), 
    'inc': (Q.SCLEX_PHP, Qsci.QsciLexerHTML), 
    'js': (Q.SCLEX_CPP, Qsci.QsciLexerJavaScript), 
    'cpp': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'h': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'cxx': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'hpp': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'c': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'hxx': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'tpl': (Q.SCLEX_CPP, Qsci.QsciLexerCPP), 
    'xml': (Q.SCLEX_XML, Qsci.QsciLexerXML), 
} 

...

def addContentsDocument(self, contents, title): 
    handler = self.makeScintilla() 
    handler.title = title 
    sci = handler.sci 
    sci.append(contents) 
    self.tabWidget.addTab(sci, title) 
    self.tabWidget.setCurrentWidget(sci) 
    self.applyLexer(sci, title) 
    EventBus.bus.broadcast('command.done', {'text': 'Opened ' + title}) 
    return handler 

    def applyLexer(self, sci, title): 
    (language, lexer) = language_and_lexer_from_title(title) 
    if lexer: 
     l = lexer() 
     print("making lexer: " + str(l)) 
     sci.setLexer(l) 
    else: 
     print("setting lexer by id: " + str(language)) 
     sci.SendScintilla(Qsci.QsciScintillaBase.SCI_SETLEXER, language) 
    linst = sci.lexer() 
    print("lexer: " + str(linst)) 

    def makeScintilla(self): 
    sci = Qsci.QsciScintilla() 
    sci.setUtf8(True) 
    sci.setTabIndents(True) 
    sci.setIndentationsUseTabs(False) 
    sci.setIndentationWidth(4) 
    sci.setMarginsFont(self.smallFont) 
    sci.setMarginWidth(0, self.smallFontMetrics.width('00000')) 
    sci.setFont(self.monoFont) 
    sci.setAutoIndent(True) 
    sci.setBraceMatching(Qsci.QsciScintilla.StrictBraceMatch) 
    handler = SciHandler(sci) 
    self.handlers[sci] = handler 
    sci.setMarginLineNumbers(0, True) 
    sci.setCaretLineVisible(True) 
    sci.setCaretLineBackgroundColor(QtGui.QColor(prefs.get('color.editline'))) 
    return handler 

가의 응용 프로그램 작업의 나머지 부분을 가정 해 봅시다을, (왜냐하면 :-)

답변

3

대답은 QsciLexerCustom의 설명서가 오도 된 것입니다. QsciStyle 객체로 setStyling()을 호출하는 것으로는 충분하지 않습니다. 해당 개체의 숫자 인덱스 만 실제로 중요합니다. 또한 사용자 정의 렉서는 font(), color() 및 스타일 색인을 사용하는 다른 스타일 지정 함수를 대체하고 해당 색인에 대해 원하는 스타일을 반환해야합니다.

관련 문제