1

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

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

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

我的问题:这里有没有人实现了对事件的延迟反应,以便在短时间内多个事件(即击键)只触发一次更新(比如每秒一次)?有没有合适的 QT 方式来做到这一点?

谢谢,迈克尔

4

1 回答 1

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 是一样的,但你应该检查一下。

于 2016-10-13T12:33:01.003 回答