します。https://www.deeplearn.me/349.htmlに転載
I.説明
イベントを処理するためのQtの一つの方法:「継承はQApplicationと再実装通知()関数。」Qtは、すべてのイベントがイベントフィルタに取得する彼らの唯一の方法を取得する前に再実装通知()関数にイベントを送信するためにはQApplicationを呼び出します。イベント・フィルターは、より便利に使用します。同時に複数のイベントフィルタが存在する可能性があるため。そして、通知()関数を一つだけ。
第二に、機能の使用
再実装はQApplicationクラスMyApplicationをヘッダファイルmyapplication.h次のように:
#ifndefのMYAPPLICATION_H の#define MYAPPLICATION_H の#include <はQApplication> の#include <QEvent> クラス MyApplicationを:パブリックはQApplication { パブリック: MyApplicationを(INT&ARGC、チャー ** ARGV)。公共: BOOL(QObjectをする*受信機、QEvent *通知E)。 }。#endifの
次のようにmyapplication.cppファイル:
#include " myapplication.h " の#include <QMouseEvent> MyApplicationを:: MyApplicationを(INT&ARGC、チャー ** ARGV)はQApplication(ARGC、ARGV) { } BOOL MyApplicationを::(QObjectを*受信機、QEvent *通知e)を { // 屏蔽MouseButtonPress、MouseButtonRelease和のMouseMove事件 であれば(E->タイプ()== QEvent :: MouseButtonPress || E->タイプ()== QEvent :: MouseButtonRelease || E->タイプ()== QEvent :: MouseMove) { 戻り 真。 } 戻りはQApplicationを::(受信機、e)に通知します。 }
mainwindow.hファイルを次のように
#ifndefのMAINWINDOW_H の#define MAINWINDOW_H する#include <QtGui / QMainWindow> の#include <のQPushButton> の#include <QMouseEvent> クラスのメインウィンドウ:公共QMainWindow { Q_OBJECTの公共: メインウィンドウ(QWidgetの *親= 0 )。 〜メインウィンドウ(); 保護: BOOL eventFilter(QObjectを* OBJ、QEvent * E); プライベート: のQPushButton * ボタン。 }。#endifの
mainwindow.cppファイルは以下のように:
#include " mainwindow.h " メインウィンドウ::メインウィンドウ(QWidgetの * 親) :QMainWindow(親) { ボタン = 新しいのQPushButton。 この - > setCentralWidget(ボタン)。 } メインウィンドウ::〜メインウィンドウ() { } BOOLメインウィンドウ:: eventFilter(QObjectを* OBJ、QEvent * E) { 場合(OBJ ==ボタン) // 响应ボタン的MouseButtonPress和MouseButtonRelease事件 { 場合(E->タイプ() == QEvent :: MouseButtonPress) { QMouseEvent * イベント = static_castを<QMouseEvent *> (E); ボタン - >のsetText(QStringの(" プレス:%1、%2 ").arg(QStringの::数(イベント - > X())、QStringの::数(イベント - > Y())))。 返す 真; } そう であれば(E->タイプ()== QEvent :: MouseButtonRelease) { QMouseEvent * イベント = static_castを<QMouseEvent *> (E)。 ボタン - >のsetText(QStringの(" リリース:%1、%2 ").arg(QStringの::数(イベント - > X())、QStringの::数(イベント - > Y())))。 返す 真; } 他 { 戻り 偽。 } } 戻りQMainWindowを:: eventFilter(OBJ、E)。 }
main.cppにファイルを次のように:
#include <QtGui /はQApplication> の#include <QtCore / QTextCodec> の#include " mainwindow.h " の#include " myapplication.h " int型のmain(int型 ARGC、CHAR * ARGV []) { MyApplicationを(ARGC、ARGV)。 QTextCodec :: setCodecForTr(QTextCodec :: codecForName(" GB18030 " )); メインウィンドウメインウィンドウ; a.installEventFilter( &メインウィンドウ)。 // 为はQApplication注册过滤器 mainwindow.setWindowTitle(QObjectを:: TR(")); mainwindow.resize(400、200 )。 mainwindow.show(); リターンa.exec(); }
プログラムを実行し、次のいずれかの検索ボタン、解除をクリックするか、マウスが任意のテキストを表示しませんドラッグすることができます。私たちははQApplicationをサブクラス化する必要があるので、イベントに到達する前にイベントははQApplicationをフィルタリングし、最初はQApplication()関数、我々がブロックされているMouseButtonPress、MouseButtonReleaseイベントサブクラスでMyApplicationというのを通知到達します。だから、フィルターが動作しませんMyApplicationを対象イベントのために登録。プログラムのインターフェイスは、次のとおりです。