语法突出显示在 QMainWindow 中不起作用
Syntax highlighting not working from QMainWindow
我正在尝试使用 PyQt4 实现语法突出显示。我试过的示例工作正常,但一旦我将其用于应用程序,突出显示就会停止工作。
我创建了一个最小示例来重现下面的问题。我删除了除评论一之外的所有正则表达式:以# 开头的行应该是粗体和绿色:
from PyQt4 import QtGui, QtCore
class Highlighter(QtGui.QSyntaxHighlighter):
def __init__(self, document):
QtGui.QSyntaxHighlighter.__init__(self, document)
rules = []
style = QtGui.QTextCharFormat()
style.setForeground(QtGui.QColor('darkGreen'))
style.setFontWeight(QtGui.QFont.Bold)
rules.append((r'#[^\n]*', style))
self._rules = [(QtCore.QRegExp(pat), fmt) for (pat, fmt) in rules]
def highlightBlock(self, text):
for (pattern, style) in self._rules:
i = pattern.indexIn(text, 0)
while i >= 0:
n = pattern.matchedLength()
self.setFormat(i, n, style)
i = pattern.indexIn(text, i + n)
self.setCurrentBlockState(0)
如果我这样使用,荧光笔效果很好:
app = QtGui.QApplication([])
editor = QtGui.QPlainTextEdit()
highlight = Highlighter(editor.document())
editor.show()
app.exec_()
但是当我在 QMainWindow 中使用它时失败了,就像这样:
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
editor = QtGui.QPlainTextEdit()
highlighter = Highlighter(editor.document())
self.setCentralWidget(editor)
app = QtGui.QApplication([])
window = MainWindow()
window.show()
app.exec_()
谁能告诉我哪里做错了?
谢谢,
迈克尔
您需要保留对荧光笔的引用。所以就这样做:
self.highlighter = Highlighter(editor.document())
编辑:
更准确地说:您需要保留对 QSyntaxHighlighter
子类的 python 部分的引用。传递给构造函数的父对象将获得荧光笔的所有权,但 Qt 显然不会自动管理 python 部分。
这是真正的区别:
print(repr(self.editor.document().children())) ...
# without keeping a reference
[<PyQt4.QtGui.QPlainTextDocumentLayout object at 0x7f8590909b88>
<PyQt4.QtGui.QSyntaxHighlighter object at 0x7f8590909c18>]
# with a reference
[<PyQt4.QtGui.QPlainTextDocumentLayout object at 0x7f56b7898c18>,
<__main__.Highlighter object at 0x7f56b7898a68>]
因此,除非您保留引用,否则您重新实现的 highlightBlock
函数对 Qt 是不可见的。
我正在尝试使用 PyQt4 实现语法突出显示。我试过的示例工作正常,但一旦我将其用于应用程序,突出显示就会停止工作。
我创建了一个最小示例来重现下面的问题。我删除了除评论一之外的所有正则表达式:以# 开头的行应该是粗体和绿色:
from PyQt4 import QtGui, QtCore
class Highlighter(QtGui.QSyntaxHighlighter):
def __init__(self, document):
QtGui.QSyntaxHighlighter.__init__(self, document)
rules = []
style = QtGui.QTextCharFormat()
style.setForeground(QtGui.QColor('darkGreen'))
style.setFontWeight(QtGui.QFont.Bold)
rules.append((r'#[^\n]*', style))
self._rules = [(QtCore.QRegExp(pat), fmt) for (pat, fmt) in rules]
def highlightBlock(self, text):
for (pattern, style) in self._rules:
i = pattern.indexIn(text, 0)
while i >= 0:
n = pattern.matchedLength()
self.setFormat(i, n, style)
i = pattern.indexIn(text, i + n)
self.setCurrentBlockState(0)
如果我这样使用,荧光笔效果很好:
app = QtGui.QApplication([])
editor = QtGui.QPlainTextEdit()
highlight = Highlighter(editor.document())
editor.show()
app.exec_()
但是当我在 QMainWindow 中使用它时失败了,就像这样:
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
editor = QtGui.QPlainTextEdit()
highlighter = Highlighter(editor.document())
self.setCentralWidget(editor)
app = QtGui.QApplication([])
window = MainWindow()
window.show()
app.exec_()
谁能告诉我哪里做错了?
谢谢, 迈克尔
您需要保留对荧光笔的引用。所以就这样做:
self.highlighter = Highlighter(editor.document())
编辑:
更准确地说:您需要保留对 QSyntaxHighlighter
子类的 python 部分的引用。传递给构造函数的父对象将获得荧光笔的所有权,但 Qt 显然不会自动管理 python 部分。
这是真正的区别:
print(repr(self.editor.document().children())) ...
# without keeping a reference
[<PyQt4.QtGui.QPlainTextDocumentLayout object at 0x7f8590909b88>
<PyQt4.QtGui.QSyntaxHighlighter object at 0x7f8590909c18>]
# with a reference
[<PyQt4.QtGui.QPlainTextDocumentLayout object at 0x7f56b7898c18>,
<__main__.Highlighter object at 0x7f56b7898a68>]
因此,除非您保留引用,否则您重新实现的 highlightBlock
函数对 Qt 是不可见的。