QObjectを継承したQWidget系のクラスはeventFilterでイベントを監視する事が可能。
つまり、エディットボックスやコンボボックスに来たイベントを実行する前に「監視」できる。
なるほど、これは便利。というか、仕事上じゃ必須か・・・。
たとえば、リストボックスでリストを選択したときに来るマウスイベントを取得して強制キャンセル。
使い方は色々ある。
tabキーを押したときにフォーカスを変更したりできるのかも~。
※キー入力はkeypressEventというのがあるので
なんていろいろ考えてみました。
というわけで、色々操作したときに来るイベントをeventFilter上で監視してコンソールに表示するサンプル。
エデットボックスのクラスポインタ等をinstallEventFilterして
イベントが来る前に表示するクラスにしてみました。
--一応イベントフィルタの使い方--
QObject(監視したい対象A) -> installEventFilter( eventFilterにQEventを発行する対象B );
これで、BのクラスにeventFilterを用意するだけでAのイベントを取得する事ができます。
サンプルコードの中にある通りです。
イベントフィルタを消したいときはremoveEventFilterをインストールと同じ方法で呼び出すだけ。
イベントフィルタの監視対象になった物はイベントが来るたびに、
eventFilterに飛ばされます。
だからQObjectクラスにあるvirtualのeventFilterの中身を作くれば監視可能。
そして戻り値でeventを実行するか判別する事ができる。
trueならフィルタしeventを発行しない。
だから、mouseイベントが来たときにtureの戻り値になるようにすれば
マウスイベントを無視する設定にもできる。
virtual bool QObject::eventFilter(QObject *obj, QEvent *event)
第一引数はイベントを受けるQObject。
第二引数は発行されるイベント。
イベント監視クラスをQObjectを継承して作って監視する。
キーイベント
色々やったがTABでフォーカスを移動した場合。
あれ?フォーカスが変わるイベントが来るわけでもない。
eventFilterに対してキーイベントがきていない件。
●マウス操作を使ったときのイベント 赤文字は4.4.0で追加されたものです。
QEvent->type() |
番号 |
説明 |
MouseButtonPress |
2 |
左右に関係なくマウスボタンを押した場合。
QMouseEventにキャスト可能。 |
MouseButtonRelease |
3 |
マウスを離した場合。Pressの後にくる。
QMouseEventにキャスト可能。 |
MouseButtonDblClick |
4 |
ダブルクリック時にくる。PressとReleaseにもメッセージが飛びます。
QMouseEventにキャスト可能。 |
MouseMove |
5 |
マウス移動した場合。マウスボタンを押してるときのみ。
QMouseEventにキャスト可能。 |
Enter |
10 |
マウスカーソルがQWidgetの矩形内に入った場合。 |
Leave |
11 |
マウスカーソルがQWidgetの矩形外に出た場合。 |
Wheel |
31 |
マウスの真中にあるホイールを回転させた場合。
QWheelEventにキャスト可能。 |
ContextMenu |
82 |
マウスで右クリックをした場合。
ポップアップメニューを出すためにある模様。 |
ToolTip |
110 |
マウスを同じ位置に置いておくと出る小さなヘルプです。
QLabel等のWidget上にマウスカーソルを乗せたままで発行。
発行後はマウスカーソルがLeave(11)するまでMouseMove(5)の変わりに発行されつづけます。QHelpEventにキャストしマウス座標取得可能。 |
NonClientAreaMouseMove |
173 |
ウィンドウとして使うWidgetに来るメッセージです。
タイトルバーやウィンドウサイズを変更する場合のライン上でメッセージが来ます。ほかにメッセージが来る場所があるかもしれない。
マウス座標はクライアント領域から判定するのでマイナス値来ます。 |
NonClientAreaMouseButtonPress |
174 |
ウィンドウとして使うWidgetに来るメッセージです。
NonClientAreaMouseMoveと同じ条件でメッセージが来ます。 |
ToolTipChange |
184 |
ツールチップを変更した場合にくるらしいが・・・
ツールチップを表示するプログラムにしないと効果が無い。
4.4.0以降に追加された。 |
今のところ、QLabelにeventFilterを入れて見張った所。
多くのイベントが到着してる事がわかった。マウスの動作をまとめてみて何が起きるのかチェックしました。
といっても、みんな知ってるか。
●キー入力時に来るイベント
---サンプルコードの使い方---
mainで監視対象のQObjectを作る前に
MessageChecker Message;でオブジェクトを作成する。
↑使い方を考え直して、staticで絶対的なオブジェクトつくったので不用になった。
あとは、インストールするQObjectに対して
MessageChecker::Install(ui.inputLabe1);を呼ぶ。
これでメッセージ表記するようになります。
あと、Windows環境ではメッセージが表示されないので
*.proファイルのなかにCONFIG += consoleを追加してください。
詳しい中身はソースコード見てください。
Asisstantのヘルプみながらやるといいかもしれません。
●
メッセージチェッカーサンプルコード(zip)
一応、マウスイベントのみ全て見地。
関係ないイベントは番号で表示するようになってます。
たまにバージョンアップしとります。
PR
<< QFileDialogでファイル名取得 | [PR]eventFilterを使ってみた | QT 4.4 RC1が公開されてた >>
HOME | 戻る