【问题标题】:Can I delay/bundle reactions to QPlainTextEditor.textChanged events?我可以延迟/捆绑对 QPlainTextEditor.textChanged 事件的反应吗?
【发布时间】:2017-02-22 12:41:10
【问题描述】:

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

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

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

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

谢谢, 迈克尔

【问题讨论】:

    标签: qt pyqt qevent qplaintextedit


    【解决方案1】:

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

    将有 2 种使用它们的方法(具有不同的结果)。


    只有在一定时间没有输入后才解析

    注意:我只知道 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 也是一样,但你应该检查一下。

    【讨论】:

    • 效果很好,谢谢! (我担心使用计时器,因为这听起来像是在拼凑一些东西,但这非常简单和优雅!)
    • @MichaelClerx 感谢您的称赞 :) 这些东西是计时器的常见用例之一。因为你不能在 GUI 应用程序中很好地“睡觉”,所以计时器是所有与延迟相关的事情的首选
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多