我有一个用于我编写的建模语言的小IDE,在PyQt / PySide中实现,我正在尝试实现一个代码导航器,让你跳转到正在编辑的文件的不同部分。
当前的实现是:(1)连接到QPlainTextEditor.textChanged,(2)任何时候进行更改,(sloppily)解析文件并更新导航器窗格
它似乎运行正常,但我担心这可能会导致较慢系统上的大型文件出现重大性能问题,特别是如果将来有更多内容连接到textChanged。
我的问题:这里是否有人对事件实施了延迟反应,因此短时间内的多个事件(即击键)只会触发一次更新(比如每秒一次)?是否有正确的QT方式来做到这一点?
谢谢, 迈克尔
答案 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是一样的,但你应该检查一下。