我可以延迟/捆绑对QPlainTextEditor.textChanged事件的反应吗?

时间:2016-10-13 11:49:28

标签: qt pyqt qevent qplaintextedit

我有一个用于我编写的建模语言的小IDE,在PyQt / PySide中实现,我正在尝试实现一个代码导航器,让你跳转到正在编辑的文件的不同部分。

当前的实现是:(1)连接到QPlainTextEditor.textChanged,(2)任何时候进行更改,(sloppily)解析文件并更新导航器窗格

它似乎运行正常,但我担心这可能会导致较慢系统上的大型文件出现重大性能问题,特别是如果将来有更多内容连接到textChanged。

我的问题:这里是否有人对事件实施了延迟反应,因此短时间内的多个事件(即击键)只会触发一次更新(比如每秒一次)?是否有正确的QT方式来做到这一点?

谢谢,   迈克尔

1 个答案:

答案 0 :(得分:3)

如果您想要一些"延迟"

,您可以尝试使用计时器

有两种方法可以使用它们(结果不同)。

只有在一段时间内没有输入任何内容后才能解析

注意:我只知道C ++ Qt,但我认为同样的事情对pyqt有效,所以这就是"伪代码"我希望你能得到这个概念。

QTimer timer; //somewhere
timer.setSingleShot(true); //only fire once
connect(timer,QTimer::timeout(),OnTimerDone(...);

OnTextChanged(...)
{
    timer.start(500); //wait 500ms
}

OnTimerDone(...)
{
    DoStuff(...);
}

这将在每次输入时重新启动计时器,因此当您调用它并且未完成计时器时,不会发出timeout信号。如果没有输入一段时间,则计时器超时并解析文件。

第二种选择是运行定期计时器(singleShot(false))。

每秒钟启动计时器。并且timeout将每秒调用一次。您可以将其与输入更改时设置为true的变量组合,并在解析文件时将其组合为false。因此,当没有任何变化时,您可以避免解析。

在C ++ Qt中,您不必担心多线程,因为在GUI线程中调用了插槽。我认为python是一样的,但你应该检查一下。