私はQtの初心者ですが、基本的にビデオゲーム風の入力ループに相当するものをQtアプリケーションに実装しようとしています(クレイジーですが、役立つかどうかを確認してください)。キーボードをどれほど奇妙にコードアップしても、モディファイアを含むすべてのキーについて、キーを押したり離したりするための正確な1対1のイベント処理が必要です。
もちろん、主要なイベントへの主なアクセスはを介して行われますQKeyEvent
。しかし、次のことが起こったとしましょう。
- ユーザーが長押ししますCtrl
- ユーザーが長押ししますUp
- ユーザーリリースCtrlとUp同時に
私が知る限り、Qtから得られるものは次のとおりです。
- を押すためのQKeyEvent、Ctrlそれ自体(
Qt::Key_Ctrl
) - を押すためのQKeyEvent、Upそれ自体(
Qt::Key_Up
) - を解放するためのQKeyEvent、Ctrl+Upおよび
key() == Qt::Key_Up
Ctrlビットが修飾子の変更に反映されます。
これは正確ではないかもしれませんが、問題のデバッグが多すぎるために何が起こっているのかを推測するのが最善です。いずれにせよ、モディファイアが含まれる場合のキーリリースイベントは非常に信頼性が低くなります。
最後にあるCtrl+Upシーケンスが問題です。e->modifiers()
これで、で修飾子の状態が取得され、でキーが押されたことがわかりましたe->key()
。ユーザーがいつモディファイアをリリースしたかを検出するために、モディファイアの状態を内部的に記憶しようとして、いくつかの複雑なハックを行うことができます。しかし、その後、Qtのドキュメントは私に次のように通知しますe->modifiers()
。
この機能は常に信頼できるとは限りません。たとえば、ユーザーは両方のShiftキーを同時に押して、そのうちの1つを離すと混乱する可能性があります。
これはまさに私が避けようとしているケースです。
Qtで、通常のキーと修飾キーの両方について、1対1のキーの押下と解放を追跡する信頼できる方法はありますか?そうでない場合、あなたが得ることができる最も近いものは何ですか?
編集:私はこれを少し洗練することができます。Macを押したまま、いくつかCmdのキー(たとえば、文字キー)を押して放し、次に離すCmdと、文字キーリリースのリリースイベントが発生しないようです。 小さな例を切り分けて、これが実際にQtのバグであるかどうかを確認します。