ウィジェットにおけるキーボードフォーカス

Qtのウィジェットは、GUIの慣習となっている方法でキーボード・フォーカスを扱います。

基本的な問題は、ユーザーのキーストロークが画面上の複数のウィンドウのいずれかに向けられる可能性があり、意図されたウィンドウ内の複数のウィジェットのいずれかに向けられる可能性があるということです。ユーザーがキーを押すと、そのキーが正しい場所に行くことを期待し、ソフトウェアはこの期待に応えようとしなければならない。システムは、キーストロークがどのアプリケーションに向けられているか、そのアプリケーション内のどのウィンドウか、そのウィンドウ内のどのウィジェットかを判断しなければなりません。

フォーカスの動き

キーボードのフォーカスを特定のウィジェットに向けるために発展してきた習慣は、以下の通りです:

  1. ユーザーがTab (またはShift+Tab )を押す。
  2. ウィジェットをクリックする。
  3. キーボードショートカットを押す。
  4. マウスホイールを使う。
  5. ユーザーがウィンドウにフォーカスを移動させ、アプリケーションがウィンドウ内のどのウィジェットにフォーカスを移動させるかを決定する。

これらの動作メカニズムはそれぞれ異なり、異なるタイプのウィジェットはそのうちのいくつかでのみフォーカスを受け取ります。順番に説明します。

タブまたはShift+タブ

Tab を押すのは、キーボードを使ってフォーカスを移動する最も一般的な方法です。(データ入力アプリケーションでは、EnterキーがTab と同じ動作をすることがあります。Qtではイベントフィルタを実装することで簡単に実現できます)。

現在一般的に使われているすべてのウィンドウシステムで、Tab を押すと、キーボードのフォーカスがウィンドウごとの円形リストの次のウィジェットに移動します。Tab は円形リストに沿って一方向に、Shift+Tab は他方向にフォーカスを移動します。Tab を押したときにウィジェットからウィジェットへ移動する順序をタブ順序と呼びます。

QWidget::setTabOrder()を使ってタブ順をカスタマイズすることができる。Tab (Qt Widgets Designerは、タブ順序を視覚的に変更する手段を提供します。

Tab を押すことは非常に一般的なので、フォーカスを持つことができるほとんどのウィジェットはタブ・フォーカスに対応しているはずです。主な例外は、めったに使用されないウィジェットで、フォーカスを移動するキーボード アクセラレータやエラー ハンドラがある場合です。

たとえば、データ入力ダイアログで、全体の1パーセントしか必要でないフィールドがあるかもしれない。そのようなダイアログでは、Tab 、このフィールドをスキップすることができ、ダイアログはこれらのメカニズムのいずれかを使うことができる:

  1. もしプログラムがそのフィールドが必要かどうかを判断できれば、ユーザーが入力を終えてOK を押したとき、または他のフィールドを入力し終えてEnterを押したときに、フォーカスをそのフィールドに移すことができます。あるいは、タブ・オーダーにフィールドを含めるが、無効にしておく。ユーザーが他のフィールドで設定した内容から見て適切であれば、有効にしてください。
  2. フィールドのラベルには、このフィールドにフォーカスを移すキーボード・ショートカットを含めることができます。

Tab サポートのもう1つの例外は、タブの挿入をサポートしなければならないテキスト入力ウィジェットです。ほとんどすべてのテキストエディタがこのクラスに分類されます。Qt はCtrl+TabTab として、Ctrl+Shift+TabShift+Tab として扱います。このようなウィジェットはQWidget::event() を再実装し、QWidget::event() を呼び出す前に Tab を処理することで、他のすべてのキーに対して通常の処理を行うことができます。しかし、システムによっては、Ctrl+Tab を他の目的で使用するものもあり、多くのユーザーはCtrl+Tab を意識していないため、これは完全な解決策とは言えません。

ユーザーがウィジェットをクリックする

これは、マウスやその他のポインティングデバイスを持つコンピューターでは、おそらくTab

クリックによるフォーカスの移動は、Tab よりも若干強力です。ウィジェットにフォーカスを移動する一方で、エディタ・ウィジェットの場合、テキスト・カーソル(ウィジェット内部のフォーカス)もマウスがクリックされた場所に移動します。

これは非常に一般的であり、人々はこれに慣れているので、ほとんどのウィジェットでこれをサポートするのは良いアイデアです。しかし、これを避ける重要な理由もあります。フォーカスがあったウィジェットからフォーカスを外したくない場合があります。

例えば、ワードプロセッサで、ユーザが'B'(太字)ツールボタンをクリックしたとき、キーボードフォーカスはどうなるでしょうか?編集ウィジェットにフォーカスが残っているのか、それとも'B'ボタンにフォーカスが移動しているのでしょうか?

テキスト入力をサポートするウィジェットではクリック・トゥ・フォーカスをサポートし、マウスクリックが異なる効果を持つほとんどのウィジェットではクリック・トゥ・フォーカスを避けることをお勧めします。(ボタンについては、キーボードショートカットを追加することもお勧めします。QAbstractButton とそのサブクラスは、これを非常に簡単にします)。

Qt では、QWidget::setFocusPolicy() 関数のみがクリック・トゥ・フォーカスに影響します。

ユーザーがキーボードショートカットを押す

キーボードショートカットがフォーカスを移動させることは珍しいことではありません。これは、モーダルダイアログを開くことによって暗黙的に起こるだけでなく、QLabel::setBuddy()、QGroupBoxQTabBar によって提供されるようなフォーカスアクセラレータを使用して明示的に起こることもあります。

アプリケーションは、ユーザがジャンプしたいすべてのウィジェットのショートカット・フォーカスをサポートできます。たとえば、タブ・ダイアログの各ページにキーボード・ショートカットを設定し、Alt+P を押して印刷ページに移動することができます。キーの数が少ないため、やりすぎになりがちであることと、コマンドのキーボードショートカットを提供することも重要であることに留意してください。例えば、マイクロソフトのキーボード・ユーザー・インターフェース・デザインのガイドラインや、アップルのフォーカスと選択のガイドラインなどです。

ユーザーがマウスホイールを回す

Microsoft Windowsでは、マウスホイールの使用は常にキーボードフォーカスを持つウィジェットによって処理されます。macOS と X11 では、マウスホイールは他のマウスイベントを取得するウィジェットによって処理されます。

Qt がこのプラットフォームの違いを処理する方法は、ホイールの使用時にウィジェットがキーボード・フォーカスを移動するようにすることです。各ウィジェットに適切なフォーカス・ポリシーを設定することで、Windows、macOS、X11上でアプリケーションをイディオムに正しく動作させることができます。

ユーザーがこのウィンドウにフォーカスを移動した場合

この状況では、アプリケーションはウィンドウ内のどのウィジェットがフォーカスを受け取るべきかを決定しなければなりません。

これは簡単なことです:以前このウィンドウにフォーカスがあった場合、最後にフォーカスを持ったウィジェットがフォーカスを取り戻すはずです。Qtはこれを自動的に行います。

このウィンドウにフォーカスが当たったことがなく、フォーカスが当たるべき場所を知っている場合は、QWidget::show ()を呼び出す前に、フォーカスを当てるべきウィジェットでQWidget::setFocus ()を呼び出します。そうしないと、Qtは適切なウィジェットを選びます。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.