PyQt - Как включить / выключить подсветку проверки орфографии - PullRequest
0 голосов
/ 05 января 2012

У меня есть кнопка, которая устанавливает / отменяет подсветку проверки орфографии в окне QTextEdit (ref PyQt - Как включить / выключить проверку орфографии ), которая работает отлично.

Затем я добавил язык выбора QComboBox и привязал его сигнал к свойству кнопки, но его подсветка set / unset не работает при смене языка. Это сводит меня с ума, может быть, я сделал что-то маленькое и глупое, но ради этого я не могу найти в этом ничего плохого.

Кнопка (скорее действие) -

self.actionSpellCheck = QAction(QIcon(self.icon_spellcheck),
            "Auto &Spellcheck", self,
            shortcut=Qt.CTRL + Qt.SHIFT + Qt.Key_O,
            triggered=self.spellcheck, checkable=True)

Поле со списком

self.cb_lang = QComboBox(tb)
    tb.addWidget(self.cb_lang)
    lang_list = self.dict_broker.list_languages()
    self.cb_lang.addItems(lang_list)
    self.cb_lang.currentIndexChanged.connect(self.spellcheck)

и self.spellcheck

def spellcheck(self):
    pos = self.cursor.position()
    if self.actionSpellCheck.isChecked():
        lang = self.cb_lang.currentText()
        self.dict = self.dict_broker.request_dict(lang)
        self.highlighter.setDict(self.dict)
        self.setHighlighterEnabled(True)
        self.show_status("Spellcheck language is set to " + self.dict.tag, None)
    else:
        self.setHighlighterEnabled(False)
        self.highlighter.setDict(None)
        self.show_status("Spellcheck is turned off", None)
    self.cursor.setPosition(pos, QTextCursor.MoveAnchor)
    self.textEdit.setTextCursor(self.cursor)
    self.textEdit.setFocus()

Почему при нажатии кнопки подсветка устанавливается / отключается, но при выборе языка ничего не происходит (это происходит только после того, как я начал печатать, а не сразу при выборе в выпадающем списке)? Спасибо.

1 Ответ

1 голос
/ 05 января 2012

Если вы посмотрите на метод HighLighter.setDict, вы увидите, что он не делает ничего, кроме переназначения атрибута dict.

Кроме того, SpellTextEdit.setHighlighterEnabled только сбрасывает документ.

Таким образом, вам понадобится метод для повторного выделения текста при изменении dict. К счастью, HighLighter является подклассом QSyntaxHighlighter, который уже имеет слот rehighlight, который делает то, что требуется.

Так что вам просто нужно изменить ваш spellcheck метод следующим образом:

def spellcheck(self):
    pos = self.cursor.position()
    if self.actionSpellCheck.isChecked():
        self.setHighlighterEnabled(True)
        lang = self.cb_lang.currentText()
        self.dict = self.dict_broker.request_dict(lang)
        self.highlighter.setDict(self.dict)
        self.highlighter.rehighlight()
    else:
        ...
...