Qt5:告诉QPlainTextEdit忽略语法高亮变化

时间:2014-03-27 10:55:36

标签: c++ syntax-highlighting qt5 textchanged qplaintextedit

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

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

有关如何过滤更改的任何想法?

我是否必须切换到QTextDocument似乎只有一个contentsChanged() is said忽略语法突出显示更改?

3 个答案:

答案 0 :(得分:2)

事实证明我已经走在正确的轨道上......并非一直如此:

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

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

m_pPlainTextEdit->document()->setModified(false);

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

BTW:来自contentsChanged的信号QTextDocument也会在格式化更改时发出,因此在我的方案中无用。

答案 1 :(得分:1)

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

当用户修改文字时,它是QKeyEvent 当荧光笔出现时,它是某种QInputMethodEvent(?)

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

您可以创建一个filterobject类,或者只在包含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);

答案 2 :(得分:-1)

不是挂钩到modificationChanged(),而是每次都重置修改后的标志,你可以直接挂钩到textChanged()。无论以前是否更改过,都会在您对文档进行更改时触发它...