QtのEvent Filter(回転)

2812 ワード

event filterとは何ですか?EventFilterとは、いわゆるイベントフィルタであり、Qtでは比較的重要な概念であり、すべてのイベントをwatchee(被監視者)に到達する前にすべて別のwatcher(監視者)に伝達し、watcherが先に処理してそのイベントを伝達し続けるかどうかを決定し、伝達を継続すればイベントはwatcheeに返信して処理する機能である.イベントフィルターで事件を処理する方法を知っている人も多いかもしれませんが、あまり簡単ではないのではないでしょうか.
event filterの一般的なアプリケーションでは、ホットキーを処理するために使用されます.たとえば、1つのインタフェースでユーザホットキーによってトリガーされる複数のボタンなどです.フォーカスを得たコントロールだけがキーボードのイベントを得ることができるため、event filterを使わないとbuttonごとにキーボードイベントの処理を加える必要があり、buttonで兄弟buttonのポインタにアクセスする必要があり、論理は非常に混乱している.メインフォームから各ボタンのeventFilterを作成する場合は、メインフォームでキーボードイベントを処理するだけで良いし、メインフォームが各buttonのポインタに簡単にアクセスできるので便利です.
派生と書き換えの代わりに使用される虚関数−Qtのキーボードマウスイベントは基本的に虚関数で処理され,虚関数を書き換えるにはサブクラスを派生させなければならないので,単純なイベント処理でも子クラスを派遣するコストが大きいのでeventFilterを使う価値がある.例えば、私のMDIインタフェースは、サブフォームが閉じるたびに統一的な操作をしたいと思っています.一般的な方法は、サブフォームのcloseEventを処理することです.しかし、明らかに各サブフォームにサブクラスを派生させるのは現実的ではなく、mainwindowをサブフォームのeventFilterとしてCloseEventイベントを処理するのが最善の方法です.
ここでは2つの例を挙げて、賢い学生たちが自分のプログラムの中でeventFilterの発揮に適した位置を見つけることができると信じています.
イベントフィルタを使用してイベントを処理する方法前のblogでは、著者のbugはQtにおけるイベント伝達の順序(見たことのない先にブラインドを掃く場合)を紹介し、QAPplicationクラスにeventFilterをインストールする2つのレベルのevent filterと、あるコントロールに対してeventFilterをインストールする2つのレベルのevent filterについて述べた.本質的には、この2つのレベルのevent filterが呼び出すのは、QObjectクラスが提供するAPI:「installEventFilter」です.
event filterの使用は少し曲がりくねっていて、2つのステップがあります.一つはwatcheeを呼び出すinstallEventFilterがwatcherポインタをパラメータとする
watchee->installEventFilter(watcher);
二つ目はwatcherのクラスでbool eventFilter(QObject*,QEvent*)という虚関数を実現し,この関数でイベントを処理することである.
 class KeyPressEater : public QObject
{
Q_OBJECT
...
 
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
 
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast(event);
qDebug("Ate key press %d", keyEvent->key());
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}

上の例のコードは直接Qtドキュメントから写したもので、ほほほ、実はドキュメントの言うことは本当にはっきりしていて、どうしてまだ多くの人がこれをどのように使うか分かりません.
ここで注意すべき点は、-watcheeとwatcherはQObjectから派生したサブクラスインスタンスでなければならない-watcherのクラスはカスタムサブクラスでなければならない(虚関数を再実現する必要があるため、既存のクラスではだめである).watcherクラスのeventFilter関数がtrueを返すと、イベントの処理が完了し、転送が続行されないことを示します.falseを返すと、イベントがまだ伝達されていることを示します.eventFilterの実装の最後にwatcherベースクラスのeventFilter関数を呼び出してイベントを伝達する必要があります.調整しないとwatcherのすべてのイベントが失われます.-注意eventFilterの宣言はドキュメントとそっくりでなければなりません.書くときは戻り値、大文字と小文字、パラメータのタイプに注意してください.
Qtには、x 11 EventFilterがプログラムによって得られるすべてのXイベントをキャプチャできるなど、プラットフォームに関連するアプリケーションレベルのeventFilter関数もあります.対応するWindowsプラットフォームの下でwinEventFilterを使います...みんなは関数の名前に誤解されないでください、これらの関数はグローバルレベルではありませんて、せいぜいアプリケーションの内部の事件を手に入れるしかなくて、システムレベルのイベントのフィルタリングをしたいのはやはりレベルが悪いです...