このページでは

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

Qt Widgetsは、GUIにおいて一般的となっている方法でキーボードフォーカスを処理します。

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

フォーカスの移動

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

  1. ユーザーがTab (またはShift+Tab )を押す。
  2. ユーザーがウィジェットをクリックする。
  3. ユーザーがキーボードショートカットを押す。
  4. ユーザーがマウスホイールを使用する。
  5. ユーザーがフォーカスをウィンドウに移動させ、アプリケーションはそのウィンドウ内のどのウィジェットにフォーカスを当てるべきかを判断する必要があります。

これらの操作方法はそれぞれ異なり、ウィジェットの種類によって、フォーカスが割り当てられる操作は一部に限られます。これらについて、順に説明していきます。

Tab または Shift+Tab

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+Tab をTab として扱い、Ctrl+Shift+Tab をShift+Tab として扱います。このようなウィジェットは、QWidget::event() を再実装し、QWidget::event() を呼び出して他のすべてのキーの通常の処理を行う前に、Tab キーを処理することができます。しかし、一部のシステムではCtrl+Tab が他の目的で使用されており、また多くのユーザーはCtrl+Tab をそもそも認識していないため、これは完全な解決策とは言えません。

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

これは、マウスやその他のポインティングデバイスを使用するコンピュータでTab を押すことよりも、おそらくさらに一般的な操作です。

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

これは非常に一般的であり、ユーザーも慣れ親しんでいるため、ほとんどのウィジェットでこれをサポートするのが望ましいでしょう。しかし、これを避けるべき重要な理由もあります。それは、フォーカスが置かれていたウィジェットからフォーカスを外したくない場合があるからです。

たとえば、ワープロでユーザーが「B」(太字)ツールボタンをクリックしたとき、キーボードフォーカスはどうなるべきでしょうか? そのままの位置(ほぼ間違いなく編集ウィジェット内)に留まるべきか、それとも「B」ボタンに移動すべきでしょうか?

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

Qt XML では、QWidget::setFocusPolicy() 関数のみが「クリックによるフォーカス」に影響を与えます。

ユーザーがキーボードショートカットを押した場合

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

アプリケーションでは、ユーザーが移動したいと思う可能性のあるすべてのウィジェットに対して、ショートカットによるフォーカス移動をサポートできます。たとえば、タブ付きダイアログでは各ページにキーボードショートカットを設定でき、ユーザーはAlt+P などを押すことで「印刷」ページに移動できます。 利用可能なキーは限られているため、これをやりすぎてしまうことは容易である点に留意してください。また、コマンドに対するキーボードショートカットを提供することも重要です。対象とするプラットフォームの設計ガイドライン(例:Microsoftのキーボードユーザーインターフェース設計ガイドラインやAppleの フォーカスおよび選択 に関するガイドライン)を参照してください。

ユーザーがマウスホイールを回転させる場合

Microsoft Windows では、マウスホイールの操作は常にキーボードフォーカスを持っているウィジェットによって処理されます。macOS および X11 では、他のマウスイベントを受け取ったウィジェットによって処理されます。

Qtでは、ホイールが使用された際にウィジェットがキーボードフォーカスを移動させることで、このプラットフォーム間の違いを処理しています。各ウィジェットに適切なフォーカスポリシーを設定することで、アプリケーションはWindows、macOS、X11の各プラットフォームで、そのプラットフォームにふさわしい動作を正しく行うことができます。

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

この状況では、アプリケーションはウィンドウ内のどのウィジェットにフォーカスを与えるべきかを決定する必要があります。

これは単純な場合もある。以前にこのウィンドウにフォーカスがあったことがある場合、最後にフォーカスを持っていたウィジェットが再びフォーカスを取得すればよい。Qtはこれを自動的に行う。

これまでこのウィンドウにフォーカスが一度もなかった場合で、フォーカスの開始位置が分かっている場合は、QWidget::show()を呼び出す前に、フォーカスを受け取るべきウィジェットに対してQWidget::setFocus()を呼び出してください。そうしないと、Qtが適切なウィジェットを選択します。

© 2026 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.