我可以 delay/bundle 对 QPlainTextEditor.textChanged 事件做出反应吗?
Can I delay/bundle reactions to QPlainTextEditor.textChanged events?
我有一个小的 IDE 用于我编写的建模语言,在 PyQt/PySide 中实现,并且我正在尝试实现一个代码导航器,让您跳转到正在编辑的文件中的不同部分。
当前的实现是:(1) 连接到 QPlainTextEditor.textChanged,(2) 任何时候进行更改,(草率地)解析文件并更新导航器窗格
它似乎工作正常,但我担心这可能会导致较慢系统上的大文件出现重大性能问题,特别是如果将来有更多内容连接到 textChanged。
我的问题:这里有没有人实现了对事件的延迟反应,以便短时间内的多个事件(即击键)只触发一次更新(比如每秒一次)?有没有合适的 QT 方法来做到这一点?
谢谢,
迈克尔
如果你想要一些,你可以尝试使用定时器"delay"。
有两种使用方法(结果不同)。
一个只有在一定时间内没有输入后才解析
注意: 我只知道 C++ Qt,但我假设相同的东西对 pyqt 有效,所以这有点 "pseudocode" 我希望你能理解这个概念。
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 是一样的,但你应该检查一下。
我有一个小的 IDE 用于我编写的建模语言,在 PyQt/PySide 中实现,并且我正在尝试实现一个代码导航器,让您跳转到正在编辑的文件中的不同部分。
当前的实现是:(1) 连接到 QPlainTextEditor.textChanged,(2) 任何时候进行更改,(草率地)解析文件并更新导航器窗格
它似乎工作正常,但我担心这可能会导致较慢系统上的大文件出现重大性能问题,特别是如果将来有更多内容连接到 textChanged。
我的问题:这里有没有人实现了对事件的延迟反应,以便短时间内的多个事件(即击键)只触发一次更新(比如每秒一次)?有没有合适的 QT 方法来做到这一点?
谢谢, 迈克尔
如果你想要一些,你可以尝试使用定时器"delay"。
有两种使用方法(结果不同)。
一个只有在一定时间内没有输入后才解析
注意: 我只知道 C++ Qt,但我假设相同的东西对 pyqt 有效,所以这有点 "pseudocode" 我希望你能理解这个概念。
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 是一样的,但你应该检查一下。