¿Cómo puedo encontrar una subcadena y resaltarla en QTextEdit?

Tengo una ventana QTextEdit que muestra el contenido de un archivo. Me gustaría poder encontrar todas las coincidencias dentro del texto usando una expresión regular y resaltarlas haciendo que el fondo de la coincidencia sea diferente o cambiando el color del texto de la coincidencia o poniéndolo en negrita. ¿Cómo puedo hacer esto?

Creo que la solución más sencilla a su problema es usar el cursor asociado a su editor para hacer el formateo. De esta manera puede configurar el primer plano, el fondo, el estilo de fuente … El siguiente ejemplo marca las coincidencias con un fondo diferente.

 from PyQt4 import QtGui from PyQt4 import QtCore class MyHighlighter(QtGui.QTextEdit): def __init__(self, parent=None): super(MyHighlighter, self).__init__(parent) # Setup the text editor text = """In this text I want to highlight this word and only this word.\n""" +\ """Any other word shouldn't be highlighted""" self.setText(text) cursor = self.textCursor() # Setup the desired format for matches format = QtGui.QTextCharFormat() format.setBackground(QtGui.QBrush(QtGui.QColor("red"))) # Setup the regex engine pattern = "word" regex = QtCore.QRegExp(pattern) # Process the displayed document pos = 0 index = regex.indexIn(self.toPlainText(), pos) while (index != -1): # Select the matched text and apply the desired format cursor.setPosition(index) cursor.movePosition(QtGui.QTextCursor.EndOfWord, 1) cursor.mergeCharFormat(format) # Move to the next match pos = index + regex.matchedLength() index = regex.indexIn(self.toPlainText(), pos) if __name__ == "__main__": import sys a = QtGui.QApplication(sys.argv) t = MyHighlighter() t.show() sys.exit(a.exec_()) 

El código se explica por sí mismo, pero si tiene alguna pregunta, simplemente hágalo.

Aquí hay una muestra de cómo puede resaltar texto en un QTextEdit :

 #!/usr/bin/env python #-*- coding:utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * class highlightSyntax(QSyntaxHighlighter): def __init__(self, listKeywords, parent=None): super(highlightSyntax, self).__init__(parent) brush = QBrush(Qt.darkBlue, Qt.SolidPattern) keyword = QTextCharFormat() keyword.setForeground(brush) keyword.setFontWeight(QFont.Bold) self.highlightingRules = [ highlightRule(QRegExp("\\b" + key + "\\b"), keyword) for key in listKeywords ] def highlightBlock(self, text): for rule in self.highlightingRules: expression = QRegExp(rule.pattern) index = expression.indexIn(text) while index >= 0: length = expression.matchedLength() self.setFormat(index, length, rule.format) index = text.indexOf(expression, index + length) self.setCurrentBlockState(0) class highlightRule(object): def __init__(self, pattern, format): self.pattern = pattern self.format = format class highlightTextEdit(QTextEdit): def __init__(self, fileInput, listKeywords, parent=None): super(highlightTextEdit, self).__init__(parent) highlightSyntax(QStringList(listKeywords), self) with open(fileInput, "r") as fInput: self.setPlainText(fInput.read()) if __name__ == "__main__": import sys app = QApplication(sys.argv) main = highlightTextEdit("/path/to/file", ["foo", "bar", "baz"]) main.show() sys.exit(app.exec_())