2012-01-04 21 views
3

我将以下内容作为编辑拼写检查的基础。我想创建一个自动拼写检查按钮,当按下这个按钮时会使拼写检查工作,而当没有按下时,拼写检查器不应该突出显示或建议任何东西。你知道类似于LibreOffice/OpenOffice的自动拼写检查工具栏按钮吗?PyQt - 如何开启/关闭拼写检查

我可以使按钮工作,没问题。我的问题是我该如何处理荧光笔?如果在按下按钮时创建了荧光笔类,那么按下按钮时我该怎么办?杀死/摧毁荧光笔班级不起作用。

我发现如何关闭上下文菜单:

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

OK,我知道了,要关闭突出我只需要设置荧光笔词典无:

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()) 

回答

1

您可以启用和使用它的方法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) 
+0

就像一个魅力!非常感谢你!!! – linuxoid 2012-01-04 05:35:08