2010年2月26日金曜日

プログラミング:Qt ですべてのQEvent を拾う方法

Qt のシグナル・スロットの仕組みはとってもスマートでプログラムも簡単に書け便利なのだが、アプリケーション内で起こるすべてのイベントを知りたいときもある。

イベントフィルターを使えば、それが簡単にできる。

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("EAT !  key code = %d", keyEvent->key());
    return true;
  }
  return QObject::eventFilter(obj, event);
}

----
main.....

  KeyPressEater* eater = new KeyPressEater();
  QApplication::instance()->installEventFilter(eater);


KeyPressEater クラスのeventFilter() の呼び出しは、オブジェクト固有のイベント呼び出しよりも先に呼ばれる。戻り値でtrue を返してしまえば、このイベントタイプの処理は他のオブジェクトによって処理されない。


0 件のコメント:

コメントを投稿