2

Qtで次のようなプログラムを書いています:

画面キャプチャ

メイン ウィンドウは私のクラスWindow : QWidgetで、QGridLayout他の 4 つのウィジェット (Input_Menu : QWidgetOutput_Menu : QWidget、そして 2 Canvas : QWidget)を含む があります。

ユーザーがキーを押したときに特定のイベントをトリガーしたいと考えています。問題は、Window時々フォーカスを失うことです(それは、に行くInput_Menu、またはおそらくInput_Menu...のボタンに行きます)

次の解決策を試しましたが、不十分な (そして汚れている) ようです。

  1. 焦点Windowを失うたびに焦点を当てます。
  2. キーボード イベントを受信するたびに、Windowの関数 (またはそのクローン)をトリガーするフォーカスを持つ可能性のある各ウィジェットに通知します。KeyPressEvent

理想的には、ウィジェットがイベント (キーボード イベントなど) を受け取り、それをどう処理すればよいかわからない場合、親のイベント ハンドラーを自動的に呼び出す必要があります。これが Qt のデフォルト機能であることを望んでいましたが、そうは見えません。一方で、フォーカス全体については本当に混乱していて、何が起こっているのかよくわかりません。誰かが私にこれを説明できますか: 私はstd::cout << "key pressed" << std::endl;自分のWindow::KeyPressEvent関数に a を含めました。プログラムを最初に実行したとき、フォーカスが の一番上の QComboBox にあるようですInput_Menu。上/下キーを押すと、そのボックス内を移動し、コンソールに「キーが押されました」と表示されません。ほとんどの文字をヒットしても何も起こりません。しかし、左/右キーを押すと、コンソールに「キーが押されました」と表示されます!?

あなたの洞察を前もって感謝します。

4

2 に答える 2

0

にイベントフィルターをインストールしQApplicationて、関連するQEvent::KeyPressイベントをグローバルにフィルター処理できます。Qtドキュメントから:

QApplicationまたはQCoreApplicationオブジェクトにイベントフィルターをインストールすることにより、アプリケーション全体のすべてのイベントをフィルター処理することもできます。このようなグローバルイベントフィルターは、オブジェクト固有のフィルターの前に呼び出されます。これは非常に強力ですが、アプリケーション全体のすべてのイベントのイベント配信を遅くします。代わりに、一般的に説明されている他の手法を使用する必要があります。

パフォーマンスの考慮事項に加えて、キーイベントをフィルタリングする前に、ウィンドウに現在フォーカスがあるかどうかを確認することを忘れないでください。そうしないと、ポップアップダイアログが壊れたり、他のウィンドウに入力したりする可能性があります。

于 2012-09-05T13:41:39.960 に答える
0

実際、モディファイアであるキー(Shift、Control など) の場合、Qt はそれらが押されているかどうかの検出をサポートしていることがわかりました。

例: if(QApplication::keyboardModifiers() == Qt::ShiftModifier)...

これで十分です。

于 2012-09-10T19:06:00.270 に答える