Комментарии 1
Достаточно забавно что я делал такую-же штуку вот буквально на прошлой неделе, только на python. Т.к. там нет прямого доступа к hunspell, то работает оно через enchant и с самопальным простейшим токенизером, если проверять английский то можно использовать встроенный токенизер enchant. Если вдруг кому надо, делюсь:
Использование очень простое, просто нужно создать и хранить где-то объект параметром передав ему QTextEdit.
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import enchant
import re
def findWord(text, pos):
words = re.split('(\W+)', text)
idx = 0
for w in words:
if pos >= idx and pos < (idx + len(w)):
return w, idx, len(w)
idx += len(w)
return None, -1, 0
class Highlighter(QSyntaxHighlighter):
def __init__(self, arg):
QSyntaxHighlighter.__init__(self, arg.document())
self.textEdit = arg
arg.customContextMenuRequested.connect(self.contextMenu)
self.dic = enchant.Dict("ru_RU")
def highlightBlock(self, text):
if len(text) == 0:
return
words = re.split('(\W+)', text)
idx = 0
fmt = QTextCharFormat()
fmt.setUnderlineColor(QColor(255, 0, 0))
fmt.setUnderlineStyle(QTextCharFormat.SpellCheckUnderline)
for w in words:
if re.match('\w', w) and not(self.dic.check(w)):
self.setFormat(idx, len(w), fmt)
idx += len(w)
def contextMenu(self, pt):
cursor = self.textEdit.textCursor()
word = None
if not(cursor.hasSelection()):
text = self.textEdit.toPlainText()
word, p, i = findWord(text, cursor.position())
menu = self.textEdit.createStandardContextMenu()
if word:
fa = menu.actions()[0]
sl = self.dic.suggest(word)
if len(sl) == 0:
none = QAction("(none)", self)
none.setEnabled(False)
menu.insertAction(fa, none)
for s in sl:
a = QAction(s, self)
a.triggered.connect(lambda b, r=s: self.replaceWord(r))
menu.insertAction(fa, a)
menu.insertSeparator(fa)
gp = self.textEdit.mapToGlobal(pt)
menu.exec_(gp)
def replaceWord(self, rep):
cursor = self.textEdit.textCursor()
text = self.textEdit.toPlainText()
word, p, i = findWord(text, cursor.position())
cursor.beginEditBlock()
cursor.setPosition(p)
cursor.setPosition(p + i, QTextCursor.KeepAnchor)
cursor.removeSelectedText()
cursor.insertText(rep)
cursor.endEditBlock()
Использование очень простое, просто нужно создать и хранить где-то объект параметром передав ему QTextEdit.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проверка орфографии в приложениях Qt