如何使用 Python 在 QTextEdit 中动态突出显示单词?

How can I highlight words dynamically in QTextEdit using Python?

我正在尝试使用 Python 创建文本匹配器应用程序。我想在 QTextEdit 中动态突出显示不匹配的单词。我正在使用 eventFilter 来匹配文本。

def eventFilter(self, obj, event):
    if obj is self.textEdit_2 and event.type() == QtCore.QEvent.KeyPress:
        if event.key() == QtCore.Qt.Key_Space:
            self.check()
        if event.key() == QtCore.Qt.Key_Backspace:
            self.textEdit_2.insertPlainText("")
            return True
    return super(MainWindow, self).eventFilter(obj, event)

这里是文字匹配代码:

def check(self):
    var=self.textEdit.toPlainText().split()
    var2=self.textEdit_2.toPlainText().split()
    i=len(var2)-1
    if var[i]!=var2[i]:
        sw=var2.pop()
        self.textEdit_2.clear()
        self.textEdit_2.append(' '.join(var2)+' '+f"<span style='background-color: yellow;'>{sw}</p>")

我需要突出显示 textedit_2 中与 textEdit 不匹配的词。

您必须在 `MainWindow 的 __init__() 构建器中为 QTextEdit 小部件(文档:QObject::installEventFilter())安装 filterObj

现在,您的代码可以正常工作,除了一件事:当您在第二个 TextEdit 中写入更多单词时,程序将无法识别错误。

对您的代码进行一些“改进”(只是为了测试,如果您能做得更好,那就完美了)您的 __init__() 将如下所示:

def __init__(self):
    ...# some code to build your app
    self.textEdit_2.installEventFilter(self) ## <<---HERE IS THE CRUCIAL PART
    self.good = True

,您的 eventFilter() 将如下所示:

def eventFilter(self, obj, event):
    if obj is self.textEdit_2 and event.type() == QtCore.QEvent.KeyPress:
        if event.key() == QtCore.Qt.Key_Space:
            self.check()
        elif event.key() == QtCore.Qt.Key_Backspace:
            self.textEdit_2.clear()
            self.good = True
            return True
        else:
            if not self.good:
                var2 = self.textEdit_2.toPlainText().split()
                sw = var2.pop()
                self.textEdit_2.clear()
                self.textEdit_2.append(' '.join(var2)+' '+f"<span style='background-color: yellow;'>{sw}</p>")
                self.good = False           
    return super(MainWindow, self).eventFilter(obj, event)

最后,您的 check() 将如下所示:

def check(self):
    var = self.textEdit.toPlainText().split()
    var2 = self.textEdit_2.toPlainText().split()
    j = len(var)-1
    i = len(var2)-1
    if i-j <= 0:
        if var[i] != var2[i]:
            sw = var2.pop()
            self.textEdit_2.clear()
            self.textEdit_2.append(' '.join(var2)+' '+f"<span style='background-color: yellow;'>{sw}</p>")
            self.good = False
    elif i-j == 1:
        sw = var2.pop()
        self.textEdit_2.clear()
        self.textEdit_2.append(' '.join(var2)+' '+f"<span style='background-color: yellow;'>{sw}</p>")
        self.good = False

self.good 只是一个 bool 变量,我让你的应用程序知道当前文本是否有错误。这是我 运行 一个简单的应用程序测试它是否有效时的样子:

编辑

找出第二个中的所有错误QTextEdit

现在,您评论说您需要找出 textEdit_2 中的所有错误。所以我做了这些:

  • 删除我之前制作的self.good bool变量
  • 稍微改变一下 eventFilter() 函数
  • 重写您的 check() 函数。

代码在这里:

def __init__(self):
    ...# some code to build your app
    self.textEdit_2.installEventFilter(self)

def eventFilter(self, obj, event):
    if obj is self.textEdit_2 and event.type() == QtCore.QEvent.KeyPress:
        if event.key() == QtCore.Qt.Key_Space:
            self.check()
        elif event.key() == QtCore.Qt.Key_Backspace:
            self.textEdit_2.clear()
            return True        
    return super(MainWindow, self).eventFilter(obj, event)

def check(self):
    var_1 = self.textEdit.toPlainText().split()
    var_2 = self.textEdit_2.toPlainText().split()
    len_1 = len(var_1)
    len_2 = len(var_2)
    self.textEdit_2.clear()
    text = []
    for it in range(len_2):
        if it < len_1:
            if var_1[it] == var_2[it]:
                text += [var_2[it]]
            else:
                text += ["<span style='background-color: yellow;'>"+var_2[it]+"</span>"]
        else:
            text += ["<span style='background-color: yellow;'>"+var_2[it]+"</span>"]
    text = ' '.join(text)
    self.textEdit_2.append(text)   

看起来像这样: