7

我有一个显示文件内容的 QTextEdit 窗口。我希望能够使用正则表达式在文本中找到所有匹配项,并通过使匹配背景不同或通过更改匹配文本颜色或使其变为粗体来突出显示它们。我怎样才能做到这一点?

4

3 回答 3

15

我认为解决问题的最简单方法是使用与编辑器关联的光标来进行格式化。通过这种方式,您可以设置前景、背景、字体样式...以下示例将匹配项标记为不同的背景。

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

该代码是不言自明的,但如果您有任何问题,请询问他们。

于 2012-12-21T10:46:36.957 回答
6

以下是如何突出显示 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_())
于 2012-12-21T03:53:25.257 回答
0

QT5 更新了正则表达式,见 QRegularExpression https://dangellog.wordpress.com/2012/04/07/qregularexpression/

我已经使用游标更新了第一个示例。

请注意以下更改:

  1. 这不会包装编辑,而是使用内部的编辑框,可以轻松更改它以允许您传入编辑小部件。

  2. 这会找到正确的正则表达式,而不仅仅是一个单词。

    def do_find_highlight(self, pattern):
        cursor = self.editor.textCursor()
        # Setup the desired format for matches
        format = QTextCharFormat()
        format.setBackground(QBrush(QColor("red")))
        
        # Setup the regex engine
        re = QRegularExpression(pattern)
        i = re.globalMatch(self.editor.toPlainText()) # QRegularExpressionMatchIterator

        # iterate through all the matches and highlight
        while i.hasNext():
            match = i.next() #QRegularExpressionMatch

            # Select the matched text and apply the desired format
            cursor.setPosition(match.capturedStart(), QTextCursor.MoveAnchor)
            cursor.setPosition(match.capturedEnd(), QTextCursor.KeepAnchor)
            cursor.mergeCharFormat(format)
于 2022-01-27T15:33:06.687 回答