如何使用 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 中动态突出显示单词?的主要内容,如果未能解决你的问题,请参考以下文章