C
タッチ入力の処理
このトピックでは、Qt Quick Ultralite にシステム入力を統合する方法について説明します。
概要
Qt Quick Ultraliteは、デフォルトでタッチイベントとキーイベントをサポートしています。これらのイベントは、platforminterface/platforminterface.h ヘッダーファイルに定義されている以下の関数によって処理されます。
- Qul::PlatformInterface::handleTouchEvent() - タッチイベントをQt Quick Ultraliteエンジンに送信します。
- Qul::PlatformInterface::handleTouchCancelEvent() - タッチイベントをキャンセルします。
- Qul::PlatformInterface::handleKeyEvent() - キーイベントをQt Quick Ultralite エンジンに送信します。
注: ISRなどから上記の関数のいずれかを直接呼び出すと 、Qt Quick Ultraliteアプリケーションの状態が破損する可能性があります。代わりに、Qul::EventQueue を使用してください。独自のキュー実装を使用することも可能ですが、その場合は、上記の関数の呼び出しはQt Quick Ultraliteのコンテキスト内で行う必要があります。つまり、PlatformContext::exec から呼び出すのが適切でしょう。
シングルタッチシステムの場合は、Qul::Platform::SinglePointTouchEventDispatcher ヘルパークラスを使用してください。これは、Qul::PlatformInterface::handleTouchEvent() よりも、Qt Quick Ultralite エンジンにタッチイベントを送信するためのより便利な方法を提供します。後者の場合、マルチタッチに関する処理を自身で行う必要があります。
デフォルトのタッチイベントやキーイベントに加え、Qul::EventQueue クラスを使用してカスタムイベントを送信することも可能です。これには、カスタムイベントを受信するためのアプリケーション内のカスタムC++ から QML へのインターフェースが必要となります。
入力処理の実装
通常、システムは割り込みを介してタッチイベントやキーイベントを受信します。システムからの入力をQt Quick Ultraliteと統合するには、システムの入力デバイスから受信した割り込みに対応するISR(割り込みサービスルーチン)を設定します。ISRは入力データを解釈し、適切な形式に変換した上で、さらなる処理のためにQt Quick Ultraliteエンジンに送信します。
ディスパッチャを使用したタッチイベントの送信
以下に、前述のQul::Platform::SinglePointTouchEventDispatcher ヘルパークラスを使用したシングルタッチシステムの例を示します。説明を簡潔にするため、プラットフォーム固有の割り込み設定やタッチイベントデータを取得する関数についてはここでは省略しています。
まず、シングルポイントタッチイベント用のQul::EventQueue と、Qul::Platform::SinglePointTouchEventDispatcher をプライベートメンバーとして持つクラスを作成します。イベントは、再実装されたQul::EventQueue::onEvent()からディスパッチされます。また、イベントキューの静的インスタンスも作成されます。
class SinglePointTouchEventQueue : public Qul::EventQueue<Qul::Platform::SinglePointTouchEvent> { public: void onEvent(const Qul::Platform::SinglePointTouchEvent &event) QUL_DECL_OVERRIDE { touchEventDispatcher.dispatch(event); } void onQueueOverrun() QUL_DECL_OVERRIDE { clearOverrun(); PlatformInterface::log("Touch event discarded/overwritten. Consider increasing the queue size.\n"); } private: Qul::Platform::SinglePointTouchEventDispatcher touchEventDispatcher; }; static SinglePointTouchEventQueue touchEventQueue;
touchISR() 関数を実装して、タッチコントローラからの割り込みを処理し、イベントをキューに投稿します。
void touchISR() { static Qul::Platform::SinglePointTouchEvent event; // Here would be platform specific code to fetch touch data and store // it into the x, y and pressed members of the the event. event.x = 0; event.y = 0; event.pressed = false; event.timestamp = Qul::Platform::getPlatformInstance()->currentTimestamp(); touchEventQueue.postEventFromInterrupt(event); }
注: PlatformContext::currentTimestamp を使用することで 、入力イベントのタイムスタンプが、Qt Quick Ultralite エンジンの他の部分と同じクロックに基づくことを保証します。
ビルドしてデバイスにフラッシュすると、画面をタッチした際に背景色が変化するはずです。
これで移植ガイドの基本的な手順は完了しましたので、状態をコミットできます。ここから導入ページに戻り、お使いのデバイスが対応している場合は、推奨されるハードウェアアクセラレーションの実装に進んでください。
特定のQtライセンスの下で利用可能です。
詳細はこちらをご覧ください。