我的应用程序中有一个QPlainTextEdit
窗口小部件,其中分配了QSyntaxHighlighter
。在该文本编辑区域内的每次内容更改后,我需要获得通知(以更新全局应用程序保存/更改状态)。但是,每次荧光笔开始工作时,信号textChanged()
也会发出,我需要以某种方式过滤掉。
我已经看过modificationChanged()
了,但这似乎也不起作用。它忽略突出显示的更改,并在第一次更改内容时成功通知我,但不会通知任何后续更改。 documentation提到我应该能够使用setModified(false)
重置内部状态,但该方法似乎不存在。
有关如何过滤更改的任何想法?
我是否必须切换到QTextDocument
似乎只有一个contentsChanged()
is said忽略语法突出显示更改?
答案 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()。无论以前是否更改过,都会在您对文档进行更改时触发它...