6

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

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

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

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

4

3 回答 3

5

事实证明我已经走在正确的轨道上......只是不是一路:

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

然而,我最初没有看到重置内部修改状态的方法(例如,当我的应用程序保存其状态时)。原因是. setModified(bool)_ QPlainTextEdit_ _ 因此,每次我需要将状态重置为未修改时,我都会调用它:QTextDocument

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

结果,当下次更改内容时,modificationChanged将再次发出,以便我可以对其做出反应,例如启用“保存”图标。

顺便说一句:contentsChanged来自的信号QTextDocument也会在格式更改时发出,因此在我的场景中没有帮助。

于 2014-04-04T21:02:29.207 回答
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);
于 2014-03-29T12:41:20.277 回答
-1

无需挂接到 modifyChanged() 并每次都重置修改后的标志,您可以挂接到 textChanged()。每当您对文档进行更改时都会触发它,无论之前是否已更改...

于 2014-07-15T13:55:35.900 回答