如何使用 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)
看起来像这样:
我正在尝试使用 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)
看起来像这样: