PyQt - 如何开启/关闭拼写检查高亮

0 投票
1 回答
1120 浏览
提问于 2025-04-17 09:34

我有一个按钮,可以在QTextEdit框中开启或关闭拼写检查的高亮显示(参考 PyQt - 如何开启/关闭拼写检查),这个功能运行得很好。

然后我添加了一个语言选择的下拉框(QComboBox),并把它的信号连接到了按钮的属性上,但在更改语言时,高亮显示的开启和关闭功能却不起作用。这让我很烦恼,可能我做了什么小错误,但我就是找不到问题出在哪里。

这个按钮(实际上是一个动作)是

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

如果你看看 HighLighter.setDict 这个方法,你会发现它其实没做什么特别的事情,只是重新设置了 dict 这个属性。

另外,SpellTextEdit.setHighlighterEnabled 只是重置了文档而已。

所以每当 dict 发生变化时,你需要一个方法来重新高亮文本。幸运的是,HighLighterQSyntaxHighlighter 的一个子类,而 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:
        ...

撰写回答