Pointer Handler

Qt Quick Pointer Handler の紹介

Published Thursday December 7th, 2017 | Leave a comment
Posted in Qt | Tags: , , ,

この記事は The Qt Blog の Say hello to Qt Quick Pointer Handlers を翻訳したものです。 執筆: Shawn Rutledge, 2017年11月23日 Qt Quick でのマルチタッチのサポートは実際のユースケースに対して不完全ではないかいうことをここ数年考えていました。2本指でスケールやローテーションやドラッグを行うための PinchArea や、複数のタッチを感知し JavaScript の簡単な状態遷移でジェスチャーを認識するような用途で利用可能な MultiPointTouchArea をこれまで提供してきました。これ以外の場合では、1)マウスのイベントが先に発生する。2)Qt は一つのマウス(core pointer)のみを想定している。3)QMouseEvent と QTouchEvent(など)に適切な共通の基底クラスが存在していないため別々にイベントが配信される。4)ショートカットが先にハンドリングされるため、タッチのイベントをマウスイベントとして扱いイベントの配信を一元化するのは難しい。これらの理由により、複数の MouseArea や Flickable を同時に使用できないようになっていました。例えば、二つのボタンを同時に押したり、二つのスライダーを同時にスライドさせたりは MouseArea ではできませんでした。 最初は MouseArea や Flickable でタッチイベントのハンドリングをすることでこの問題を解決しようと思いました。しかし、このためのコードは非常に複雑で、QMouseEvent の処理と QTouchEvent の処理をまったく同じように動かすためにはこの二つのコードパスにたいしてまったく同じコードを大量に書くハメになりました。数ヶ月取り組んだ結果、一応動く形にはなりました…が、既存のすべてのテストを通すのが非常に難しく、動作の振る舞いが変わる恐れがあるとの忠告を仲間からは受けました。MouseArea はその名のとおりマウスイベントのハンドリングを目的としているため、タッチイベントのハンドリングをしてしまうと不適切な感じになってしまいます。そして、アプリケーションやコントロールのセットは意図と反して2つのボタンやタブやラジオボタンを同時に押すことが可能になってしまいます。(ということで、オプトイン用のブール型のプロパティを追加して試してみたりはしましたが、それをすべての MouseArea に設定するのはツラいでしょう。)MouseArea と Flickable は協調して動く必要もあり、すべてを正しく動作させるように注意深く変更をする必要がありました。これ自体は可能ではありましたが、いまいち自信がなかったため Qt 5.5 での提供は控えました。 というわけで、試行錯誤を繰り替えした結果、別の方法でこの問題を解決することに落ち着きました。 まず、バイナリの互換性の壊すような […]

Read More
Get started today with Qt Download now