python - PyQt - 如何打开/关闭拼写检查

标签 python pyqt syntax-highlighting pyqt4 spell-checking

我使用以下内容作为编辑器拼写检查程序的基础。我想制作一个自动拼写检查按钮,按下该按钮将使拼写检查器工作,而当未按下时,拼写检查器不应突出显示或建议任何内容。您知道类似于 LibreOffice/OpenOffice 的自动拼写检查工具栏按钮吗?

我可以让按钮工作,没问题。我的问题是我应该如何处理荧光笔?如果按下按钮时创建荧光笔类,那么当按钮未按下时怎么办?杀死/销毁荧光笔类不起作用。

我找到了关闭上下文菜单的方法:

if self.actionSpellCheck.isChecked(): #This is my auto-spellchecking button
    popup_menu.exec_(event.globalPos())

好的,我明白了,要关闭突出显示,我只需要将荧光笔字典设置为“无”即可:

self.highlighter.setDict(None)

要再次打开它,只需将词典设置回荧光笔即可:

self.highlighter.setDict(self.dict)

谢谢。

下面是我在其中添加了一个带按钮的工具栏的原始代码:

__license__ = 'MIT'
__copyright__ = '2009, John Schember '
__docformat__ = 'restructuredtext en'

import re
import sys

import enchant

from PyQt4.Qt import QAction
from PyQt4.Qt import QApplication
from PyQt4.Qt import QEvent
from PyQt4.Qt import QMenu
from PyQt4.Qt import QMouseEvent
from PyQt4.Qt import QPlainTextEdit
from PyQt4.Qt import QSyntaxHighlighter
from PyQt4.Qt import QTextCharFormat
from PyQt4.Qt import QTextCursor
from PyQt4.Qt import Qt
from PyQt4.QtCore import pyqtSignal

class SpellTextEdit(QPlainTextEdit):

    def __init__(self, *args):
        QPlainTextEdit.__init__(self, *args)

        # Default dictionary based on the current locale.
        self.dict = enchant.Dict("ru_RU")
        self.highlighter = Highlighter(self.document())
        self.highlighter.setDict(self.dict)

    def mousePressEvent(self, event):
        if event.button() == Qt.RightButton:
            # Rewrite the mouse event to a left button event so the cursor is
            # moved to the location of the pointer.
            event = QMouseEvent(QEvent.MouseButtonPress, event.pos(),
                Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
        QPlainTextEdit.mousePressEvent(self, event)

    def contextMenuEvent(self, event):
        popup_menu = self.createStandardContextMenu()

        # Select the word under the cursor.
        cursor = self.textCursor()
        cursor.select(QTextCursor.WordUnderCursor)
        self.setTextCursor(cursor)

        # Check if the selected word is misspelled and offer spelling
        # suggestions if it is.
        if self.textCursor().hasSelection():
            text = unicode(self.textCursor().selectedText())
            if not self.dict.check(text):
                spell_menu = QMenu('Spelling Suggestions')
                for word in self.dict.suggest(text):
                    action = SpellAction(word, spell_menu)
                    action.correct.connect(self.correctWord)
                    spell_menu.addAction(action)
                # Only add the spelling suggests to the menu if there are
                # suggestions.
                if len(spell_menu.actions()) != 0:
                    popup_menu.insertSeparator(popup_menu.actions()[0])
                    popup_menu.insertMenu(popup_menu.actions()[0], spell_menu)

        popup_menu.exec_(event.globalPos())

    def correctWord(self, word):
        '''
        Replaces the selected text with word.
        '''
        cursor = self.textCursor()
        cursor.beginEditBlock()

        cursor.removeSelectedText()
        cursor.insertText(word)

        cursor.endEditBlock()


class Highlighter(QSyntaxHighlighter):

    WORDS = u'(?iu)[\w\']+'

    def __init__(self, *args):
        QSyntaxHighlighter.__init__(self, *args)

        self.dict = None

    def setDict(self, dict):
        self.dict = dict

    def highlightBlock(self, text):
        if not self.dict:
            return

        text = unicode(text)

        format = QTextCharFormat()
        format.setUnderlineColor(Qt.red)
        format.setUnderlineStyle(QTextCharFormat.SpellCheckUnderline)

        for word_object in re.finditer(self.WORDS, text):
            if not self.dict.check(word_object.group()):
                self.setFormat(word_object.start(),
                    word_object.end() - word_object.start(), format)


class SpellAction(QAction):

    '''
    A special QAction that returns the text in a signal.
    '''

    correct = pyqtSignal(unicode)

    def __init__(self, *args):
        QAction.__init__(self, *args)

        self.triggered.connect(lambda x: self.correct.emit(
            unicode(self.text())))


def main(args=sys.argv):
    app = QApplication(args)

    spellEdit = SpellTextEdit()
    spellEdit.show()

    return app.exec_()

if __name__ == '__main__':
    sys.exit(main())

最佳答案

您可以使用它的 setDocument 来启用和禁用语法荧光笔。方法。

SpellTextEdit 类保留对其荧光笔的引用,因此只需添加几个方法,如下所示:

def highlighterEnabled(self):
     return self.highlighter.document() is not None

def setHighlighterEnabled(self, enable):
    if enable != self.highlighterEnabled():
        if enable:
            self.highlighter.setDocument(self.document())
        else:
            self.highlighter.setDocument(None)

关于python - PyQt - 如何打开/关闭拼写检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8722061/

相关文章:

python - 如何对Python嵌套列表中的数据进行分类

python - 无法关闭 GUI 应用程序

Visual Web Developer 中的 PHP 语法突出显示?

editor - 示例编程语言的语法突出显示

python - 在 vim 中高亮显示 python 代码块

python - 如何遍历 .dat 文件并将每组行的特定列 append 到数组

python - 如何转换大型数据框

python - 欧拉函数没有给出结果

python - 如何在 PyQt5 中创建 QWebEngineView 的打印预览?

mysql - PYQT : qCombobox displaying Column "Name" but passing Column "ID"