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

Posted

技术标签:

【中文标题】如何使用 Python 在 QTextEdit 中动态突出显示单词?【英文标题】:How can I highlight words dynamically in QTextEdit using Python? 【发布时间】:2021-01-27 14:45:03 【问题描述】:

我正在尝试使用 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 不匹配的单词。

【问题讨论】:

【参考方案1】:

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

现在,您的代码可以正常工作了,除了一件事:当您在第二个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 只是一个布尔变量,我让你的应用知道当前文本是否有错误。这是我运行一个简单的应用程序以测试它是否有效时的外观:

编辑

查找第二个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)   

它看起来像这样:

【讨论】:

self.textEdit_2.setStyleSheet("") 的意义何在?此外,事件过滤器中的else 可能只是elif 感谢您的改进。但是代码存在一些问题。一旦遇到错误,就无法写入新单词,因为文本与先前的错误合并。我需要找到 textedit_2 中的所有错误。 @musicamante 是的,你是对的,你指出的两件事都是我为了获得“体面的结果”而进行的其他测试的残留物,现在毫无意义。我会完善我的答案 @Aditya Joshi 您没有问:“如何比较两个句子并找出错误?”,您的问题是“如何使用 Python 在 QTextEdit 中动态突出显示单词?”。无论如何,我会尝试做一些可以帮助你的事情,但要考虑到我所说的。 @AdityaJoshi 现在可以了,检查一下,如果发现错误,请告诉我。

以上是关于如何使用 Python 在 QTextEdit 中动态突出显示单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 Qtextedit 背景颜色?

如何在 QTextEdit 中使链接可点击?

如何让 QTextBrowser 显示 QTextEdit 的内容?

在 QTextEdit 中使用富文本

python pyqt5 QTextEdit 多行文本框

Python Qt GUI设计:QLineEdit和QTextEdit文本框类(基础篇—13)