Qt5:告诉QPlainTextEdit忽略语法高亮更改

Qt5: Tell QPlainTextEdit to ignore syntax highlighting changes

本文关键字:语法 高亮 告诉 QPlainTextEdit Qt5      更新时间:2023-10-16

我的应用程序中有一个QPlainTextEdit小部件,它有一个QSyntaxHighlighter分配给它。在文本编辑区域中的每次内容更改时,我都需要获得一个通知(以更新全局应用程序保存/更改状态)。然而,每次荧光笔工作时,信号textChanged()也会发出,我需要以某种方式过滤掉。

我已经看了modificationChanged(),但这似乎也不起作用。它忽略了突出显示的更改,并成功地在第一次内容更改时通知我,但不会通知任何后续更改。文档提到,我应该能够用setModified(false)重置内部状态,但该方法似乎不存在。

关于如何过滤更改有什么想法吗?

我是否必须切换到QTextDocument,这似乎有一个单一的contentsChanged(),据说忽略语法突出显示的变化?

原来我已经在正确的轨道上了…只是不是全部:

我确实需要侦听modificationChanged信号,因为它们是在内容更改时发出的(这是我的应用程序保存状态处理的相关事件)。

然而,我最初并没有看到重置内部修改状态的方法(例如,当我的应用程序保存其状态时)。原因是setModified(bool)不存在于QPlainTextEdit,但我意识到每个对象内部都有一个QTextDocument,其中有该方法。因此,每次需要将状态重置为未修改状态时,我只需调用它:
m_pPlainTextEdit->document()->setModified(false);

因此,当下次内容更改时,modificationChanged将再次发出,以便我可以对它做出反应,例如启用"保存"图标。

BTW: QTextDocument的信号contentsChanged也在格式更改时发出,因此在我的场景中没有帮助。

我还没有测试过,这基本上只是一个想法。

当用户修改文本时,它是一个QKeyEvent。
当荧光笔这样做时,它是某种QInputMethodEvent (?)

你可以做的是,检查事件是否是QKeyEvent,如果不是,阻塞它。

您可以创建一个过滤器对象类,或者只是在包含QTextEdit的类中定义以下方法。

bool MyClass::eventFilter(QObject *o, QEvent *e)
{
    if (e->type() == QKeyEvent) //The user modified the text edit
        return false;
    else
        return true;
}

如果您在包含QTextEdit的类中定义它,则必须安装它(例如在构造函数中):

myTextEdit->installEventFilter(this);

不需要挂接modificationChanged()并每次都重置modified标志,您可以直接挂接textChanged()。它会在任何时候对文档进行更改时触发,而不管之前是否更改过…