How can I find a substring and highlight it in QTextEdit?

前端 未结 2 652
天命终不由人
天命终不由人 2021-01-02 21:59

I have a QTextEdit window that shows the content of a file. I would like to be able to find all matches inside the text using a regex and highlight them either by making th

相关标签:
2条回答
  • 2021-01-02 22:31

    Here is a sample of how can you highlight text in a 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_())
    
    0 讨论(0)
  • 2021-01-02 22:44

    I think the simplest solution to your problem is to use the cursor associated to your editor in order to do the formatting. This way you can set the foreground, the background, the font style... The following example marks the matches with a different background.

    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_())
    

    The code is self-explanatory but if you have any questions just ask them.

    0 讨论(0)
提交回复
热议问题