我的应用程序中有一个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()。它会在任何时候对文档进行更改时触发,而不管之前是否更改过…