2016-10-13 9 views
0

PyQt/PySideで実装したモデリング言語用の小さなIDEがあります。コードナビゲータを実装しようとしていますが、編集中のファイルの別のセクションにジャンプします。QPlainTextEditor.textChangedイベントへの反応を遅延/バンドルすることはできますか?

現在の実装である:OKに動作するようです(2)変更が行われ、いつでも、(だらしが)ファイルを解析し、ナビゲータ・ペイン

を更新し、(1)QPlainTextEditor.textChangedに接続しますが、私はこれが遅いシステム上の大容量のファイルに対して大きなパフォーマンス上の問題を引き起こす可能性があることを心配しています。特に、今後さらに多くのものがtextChangedに接続されているとしたら、

私の質問:ここに誰かがイベントへの反応が遅れているので、短期間に複数のイベント(キーストローク)が1回の更新(たとえば1秒間に1回)だけトリガーされますか?そして、これを行う適切なQT方法がありますか?

おかげで、 マイケル

答えて

3

あなたには、いくつかの「遅れ」をしたい場合は、タイマーを使用して試すことができます。

これらを使用するには2通りの方法があります(結果が異なる場合)。


一つの入力が一定時間の量

NOTEのために行われていなかった後にのみ解析ですので、これは一種である私は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信号が放出されていないに行われていないとき。タイマーがタイムアウトしたときに入力が行われず、ファイルが解析されます。


第2のオプションは、定期的なタイマー(singleShot(false))を実行することです。

ちょうど毎秒のようにタイマーを開始してください。 timeoutは1秒に1回呼び出されます。これを変数と組み合わせることができます。この変数は、入力が変化するとtrueに、ファイルが解析されるとfalseに設定されます。したがって、何も変更されていない場合は解析を行わないようにします。

C++では、スロットがGUIスレッドで呼び出されるため、マルチスレッドについて心配する必要はありません。私はそれがpythonと同じだと仮定しますが、おそらくこれをチェックすべきです。

+0

美しく動作します、ありがとう! (タイマを使用することに心配していました。なぜなら、何かを一緒にハッキングしているように思えたからですが、これは非常にシンプルでエレガントです。) –

+0

@MichaelClerxは褒めてくれてありがとうございました:)これらのものはタイマーの通常の用途です。 GUIアプリケーションでは「スリープ」できないため、タイマーはすべての遅延関連の問題です – Hayt

関連する問題