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

Qt 我可以延迟/捆绑对QPlainTextEditor.textChanged事件的反应吗?,qt,pyqt,qevent,qplaintextedit,Qt,Pyqt,Qevent,Qplaintextedit,我有一个用于我编写的建模语言的小型IDE,用PyQt/PySide实现,我正在尝试实现一个代码导航器,让您可以跳转到正在编辑的文件中的不同部分 当前的实现是:(1)连接到QPlainTextEditor.textChanged,(2)在进行任何更改时,(草率地)解析文件并更新导航器窗格 它似乎工作正常,但我担心这可能会导致较慢系统上的大文件出现重大性能问题,特别是如果将来有更多的内容连接到文本更改 我的问题:这里有没有人对事件实施了延迟反应,使得多个事件(即击键)在短时间内只触发一次更新(比如每

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

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

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

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

谢谢,
Michael

如果你想要一些“延迟”,你可以尝试使用计时器

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


一种是在一定时间内没有输入后才进行解析

<强>注:我只知道C++ Qt,但我假设相同的东西对PyQT有效,所以这是一种“伪代码”,希望你能得到这个概念。< /P>

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

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

OnTimerDone(...)
{
    DoStuff(...);
}
这将在每次输入时重新启动计时器,因此当您调用该命令且计时器未完成时,
超时
信号不会发出。当一段时间内没有输入时,计时器将超时,您将解析文件


第二个选项是运行定期计时器(
singleShot(false)

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


在C++Qt中,您不必担心多线程问题,因为插槽是在GUI线程中调用的。我认为python也是如此,但您可能应该检查一下。

效果很好,谢谢!(我很担心使用计时器,因为它听起来像是在一起破解东西,但这很简单也很优雅!)@MichaelClerx感谢你的夸奖:)这些东西是计时器的常见用法之一。因为您无法在GUI应用程序中很好地“睡眠”,所以计时器是所有与延迟相关的东西的后盾