Подсветка PyQt4

Я пытаюсь добавить подсветку синтаксиса в текстовый редактор в PyQt4. Я нашел в документации пример, который работает при компиляции из С++, но когда я конвертирую его в Python/PyQt, он больше не работает.

Часть кода, которая дает сбой (больше ничего не выделяет):

def highlightCurrentLine(self):

    extraSelections = []

    if not self.isReadOnly():
        selection = QTextEdit.ExtraSelection()

        lineColor = QColor(Qt.yellow).lighter(160)

        selection.format.setBackground(lineColor)
        selection.format.setProperty(QTextFormat.FullWidthSelection, QVariant(True))
        selection.cursor = self.textCursor()
        selection.cursor.clearSelection()
        extraSelections.append(selection)

    self.setExtraSelections(extraSelections)

который вызывается:

self.connect(self, SIGNAL('cursorPositionChanged()'), self.highlightCurrentLine)

Кто-нибудь знает, почему это не работает?

Версии, которые я использую: Python 2.6.2, PyQt 4.4.4.


person JonahSan    schedule 24.09.2009    source источник


Ответы (2)


Хорошо... оказывается, я не сошел с ума, я просто использовал устаревшую версию PyQt4.

Для информации, версия PyQt4, поставляемая с Ubuntu 9.04, — 4.4.4, но для этой функциональности, похоже, требуется версия 4.5+.

Я обновился до PyQt4 4.6, и он отлично работает (плюс 4.6, похоже, также имеет некоторые приятные новые функции).

person JonahSan    schedule 01.10.2009

Сохраните lineColor где-нибудь (например, self.lineColor). В противном случае Python отбросит объект, когда метод вернется, и format будет использовать недопустимый указатель.

person Aaron Digulla    schedule 24.09.2009
comment
Спасибо за ваш ответ. К сожалению, это не помогло. Я совершенно уверен, что метод setBackground должен хранить ссылку на lineColor. - person JonahSan; 24.09.2009
comment
Нет, это не так: Python передает указатель методу C++, который сохраняет его внутри. Когда он возвращает, часть Python удаляется (что также удаляет объект C++), и теперь setBackground() указывает на недопустимый экземпляр. - person Aaron Digulla; 24.09.2009
comment
PS: я боялся, что это не было причиной проблемы, но тем не менее это ошибка. - person Aaron Digulla; 24.09.2009