« 音の出し方が違う… | トップページ | PCMデータはどのように届いているの »

2014年3月20日 (木)

すべてはイベントである…らしい

PCMのバッファリングを検討していますが、気分転換に書きます。

リモートデスクトップツールなので、遠隔操作が出来なくては意味がありません(無いことはないですが(^_^;、操作したい時はありますよね)。ですので、デバイスの入力を扱う必要があります。

Qtでは、キーボード、マウス、タッチパネルなど入力デバイスからの操作をすべてイベントとして扱います。キーを押したり、離したり、マウスを動かしたり、クリックしたり、そういった操作は全部イベントとして伝わり、このイベントと指定の関数を結びつけることで、キーを押すたびにとか離すたびに呼び出される関数が指定できます。

この仕組みはQtでのいろんな処理についても同様に扱えるようになっています。例えば、ウィンドウのCloseアイコンでウィンドウが閉じられたりした時に呼び出す関数の指定も、ネットワーク通信で接続が完了した時、データが届いた時、全部同じように結び付けられた関数が呼び出され、その中で処理を行うことになります。

キーボードの操作、マウスの操作(クリック、ホイール、その他)もイベントで伝わってくるところまでは、すでに実装していますが、Brynhildrサーバさんにどのように伝えるのかがよくわからないので、Pending中です。

書き忘れてましたが、メニューとかアイコンを選択した時の操作もイベントとして扱われます。
例えば、こんな感じ。このイベントがきたら、この関数を呼び出してねという設定です。


void Brynhildr::createActions()
{
    // exit Action
    exitAction = new QAction(tr("Exit"), this);
    exitAction->setStatusTip(tr("Exit Qt Brynhildr"));
    connect(exitAction, SIGNAL(triggered()), this, SLOT(exit()));

// about Action
aboutAction = new QAction(tr("About"), this);
aboutAction->setStatusTip(tr("Show Qt Brynhildr"));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));

// about Qt Action
aboutQtAction = new QAction(tr("About &Qt"), this);
aboutQtAction->setStatusTip(tr("Show Qt library's About box"));
connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}

#もちろん、QtのRADツールを使えば、このあたりはGUIで簡単に作れると思います。
#でも、手動での作り方を知っておいて損はないと思います。

ここまで書いて、アレなのですがキーボードとかマウスの操作では予め呼び出される関数が決められています。
これを自前の関数が呼び出されるように変更するためには、関数のオーバライドという仕組みを用いることになります。要は決められた名前(引数も同じでないといけません)の関数を自分のクラスでも定義すればいいんですが、このあたりはC++のクラスについて知る必要がありますね。

どんな関数を書けば(オーバライドすれば)いいかはQt Assistantで調べられます。例えば、こんな関数を定義します。
#オーバーライドするということはもともと標準の処理がすでに入っていることを意味します。ですので、標準の処置も行いたい時は、オーバライドする前のもともとの関数を呼び出してやる必要があります。

// paint event
void paintEvent(QPaintEvent *event) ウィンドウ内部の画像再描画が必要な時に呼び出されます

// resize event
void resizeEvent(QPaintEvent *event) ウィンドウの大きさを変えた時に呼び出されます

// mouse press event
void mousePressEvent(QMouseEvent *event) マウスボタンを押した時に呼び出されます

// mouse move event
void mouseMoveEvent(QMouseEvent *event) マウスを動かした時に呼び出されます

// mouse release event
void mouseReleaseEvent(QMouseEvent *event) マウスボタンを離した時に呼び出されます

// key press event
void keyPressEvent(QKeyEvent *event) キーを押した時に呼び出されます

// mouse wheel event
void wheelEvent(QWheelEvent *event) マウスホイールを回した時に呼び出されます

どんなキーを押したのかとかマウスの位置情報とかはそれぞれの引数(イベント)に情報が含まれてますので、関数の中でこれらの情報を取得して、いろんなことを調べられます。昔みたいにI/Oポートを調べて…なんてことはしなくていいのは便利ですね。今どきはそんなことをしているのは最下層のドライバーさんたちなので、Qtはその情報をさらにわかり易く加工して開発者に提供してくれています。

#私自身がC++初心者なので、うまく伝わらないかもしれませんね。
#ソースを見るのが参考になると思うのですが…

« 音の出し方が違う… | トップページ | PCMデータはどのように届いているの »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: すべてはイベントである…らしい:

« 音の出し方が違う… | トップページ | PCMデータはどのように届いているの »