4

私はQtの初心者ですが、基本的にビデオゲーム風の入力ループに相当するものをQtアプリケーションに実装しようとしています(クレイジーですが、役立つかどうかを確認してください)。キーボードをどれほど奇妙にコードアップしても、モディファイアを含むすべてのキーについて、キーを押したり離したりするための正確な1対1のイベント処理が必要です。

もちろん、主要なイベントへの主なアクセスはを介して行われますQKeyEvent。しかし、次のことが起こったとしましょう。

  • ユーザーが長押ししますCtrl
  • ユーザーが長押ししますUp
  • ユーザーリリースCtrlUp同時に

私が知る限り、Qtから得られるものは次のとおりです。

  • を押すためのQKeyEvent、Ctrlそれ自体(Qt::Key_Ctrl
  • を押すためのQKeyEvent、Upそれ自体(Qt::Key_Up
  • を解放するためのQKeyEvent、Ctrl+Upおよびkey() == Qt::Key_UpCtrlビットが修飾子の変更に反映されます。

これは正確ではないかもしれませんが、問題のデバッグが多すぎるために何が起こっているのかを推測するのが最善です。いずれにせよ、モディファイアが含まれる場合のキーリリースイベントは非常に信頼性が低くなります。

最後にあるCtrl+Upシーケンスが問題です。e->modifiers()これで、で修飾子の状態が取得され、でキーが押されたことがわかりましたe->key()。ユーザーがいつモディファイアをリリースしたかを検出するために、モディファイアの状態を内部的に記憶しようとして、いくつかの複雑なハックを行うことができます。しかし、その後、Qtのドキュメントは私に次のように通知しますe->modifiers()

この機能は常に信頼できるとは限りません。たとえば、ユーザーは両方のShiftキーを同時に押して、そのうちの1つを離すと混乱する可能性があります。

これはまさに私が避けようとしているケースです。

Qtで、通常のキーと修飾キーの両方について、1対1のキーの押下と解放を追跡する信頼できる方法はありますか?そうでない場合、あなたが得ることができる最も近いものは何ですか?

編集:私はこれを少し洗練することができます。Macを押したまま、いくつかCmdのキー(たとえば、文字キー)を押して放し、次に離すCmd、文字キーリリースのリリースイベントが発生しないようです。 小さな例を切り分けて、これが実際にQtのバグであるかどうかを確認します。

4

2 に答える 2

2

キーボードで非常に具体的になっている場合は、Qt を離れて OS 固有のものを取得するか、フィルタリングが発生する前に Qt イベントを処理する必要があると思います。

フィルタリング前に Qt イベントを処理する

Qt のアクセラレータは Alt+__ コンボを探して待機します。QAction がリッスンするように Ctrl+__ コンボを設定できます。

QApplication および一般的な GUI 環境に組み込まれているこれらのタイプのオブジェクトはどちらも、取得しているメッセージを中断し、期待したものよりも少ないメッセージを表示する可能性があります。

Qt ドキュメンテーション: The Event System ... この部分にはこれへのリンクがあります ...

QCoreApplication::notify() ... これは、Qt API を使用して入力を処理するように Qt アプリケーションを作成できることを最高レベルに通知します。

にイベント フィルタをインストールしQCoreApplication::instance()ます。このようなイベント フィルターは、すべてのウィジェットのすべてのイベントを処理できるため、notify(); を再実装するのと同じくらい強力です。さらに、複数のアプリケーション グローバル イベント フィルタを設定することもできます。グローバル イベント フィルターは、無効化されたウィジェットのマウス イベントも表示します。アプリケーション イベント フィルタは、メイン スレッドに存在するオブジェクトに対してのみ呼び出されることに注意してください。

OS 固有のキーボード処理の代替手段

上記のレベルでインストールされた Qt イベント フィルターからのデバッグ ステートメントを見ると、質問で述べたものと同じ結果が得られる場合は、OS 固有のキーボード入力に移動する必要があります。たとえば、Windows では、キーボードをスキャンするか、キーボード全体の VK 状態を調べて、何かを行う必要があります ( GetKeyboardState().

于 2012-06-14T02:50:34.860 に答える
0

この質問に答えるのが少し遅いことは承知しています。それでも... Mac キー リリース イベントで同じ問題が発生し、未解決のバグ QTBUG-36839 があります。Windows では、すべてのキーのプレス/リリースをキャッチするキーボード フックを実装できます。しかし、それでも場合によっては信頼できません。たとえば、ロック解除後にロック画面のショートカットを入力しても、キーのリリースは表示されません。Mac のフックに似たものがあるに違いないと思います。ユーザーが押した物理キーを正確に覚えておくことが重要な場合は、これが最善の方法の 1 つだと思います。同時に、私の経験から、低レベルのことを行うには多くの時間がかかり、想像もできなかった場合に奇妙なバグが発生する可能性があります。問題は、QAction のようなもので必要なものを作成できないということですか? または、ショートカットでコマンドの代わりにコントロールを使用することもできます:)

于 2016-02-19T10:57:17.067 に答える