Focalisation du clavier dans les widgets
Les widgets Qt gèrent le focus clavier selon des méthodes désormais courantes dans les interfaces graphiques.
Le principe de base est que les frappes de l'utilisateur peuvent être destinées à n'importe laquelle des différentes fenêtres affichées à l'écran, et à n'importe lequel des différents widgets contenus dans la fenêtre visée. Lorsqu'un utilisateur appuie sur une touche, il s'attend à ce que celle-ci soit dirigée vers le bon endroit, et le logiciel doit s'efforcer de répondre à cette attente. Le système doit déterminer à quelle application la frappe est destinée, à quelle fenêtre au sein de cette application, et à quel widget au sein de cette fenêtre.
Mouvement du focus
Les conventions qui se sont développées pour diriger le focus clavier vers un widget particulier sont les suivantes :
- L'utilisateur appuie sur « Tab » (ou « Shift+Tab »).
- L’utilisateur clique sur un widget.
- L'utilisateur appuie sur un raccourci clavier.
- L'utilisateur utilise la molette de la souris.
- L'utilisateur déplace le focus vers une fenêtre, et l'application doit déterminer quel widget de cette fenêtre doit recevoir le focus.
Chacun de ces mécanismes d'interaction est différent, et seuls certains d’entre eux permettent à différents types de widgets de recevoir le focus. Nous allons les aborder tour à tour.
Tab ou Maj+Tab
Appuyer sur Tab est de loin le moyen le plus courant de déplacer le focus à l’aide du clavier. (Parfois, dans les applications de saisie de données, la touche Entrée a le même effet que Tab; cela peut facilement être mis en œuvre dans Qt en implémentant un filtre d’événements.)
Dans tous les systèmes de fenêtrage couramment utilisés aujourd’hui, appuyer sur Tab déplace le focus clavier vers le widget suivant dans une liste circulaire propre à chaque fenêtre. Tab déplace le focus le long de la liste circulaire dans un sens, tandis que Shift+Tab le fait dans l’autre. L’ordre dans lequel les pressions sur Tab se déplacent d’un widget à l’autre s’appelle l’ordre de tabulation.
Vous pouvez personnaliser l’ordre de tabulation à l’aide de la méthode QWidget::setTabOrder(). (Si vous ne le faites pas, la touche Tab déplace généralement le focus dans l’ordre de création des widgets.) Qt Widgets Designer permet de modifier visuellement l’ordre de tabulation.
Comme l’appel de la méthode ` Tab ` est très courant, la plupart des widgets pouvant recevoir le focus devraient prendre en charge le focus par tabulation. La principale exception concerne les widgets rarement utilisés, pour lesquels un raccourci clavier ou un gestionnaire d’erreurs déplace le focus.
Par exemple, dans une boîte de dialogue de saisie de données, il peut y avoir un champ qui n'est nécessaire que dans 1 % des cas. Dans une telle boîte de dialogue, la touche « Tab » pourrait ignorer ce champ, et la boîte de dialogue pourrait utiliser l'un des mécanismes suivants :
- Si le programme est en mesure de déterminer si le champ est nécessaire, il peut y déplacer le focus lorsque l’utilisateur a terminé sa saisie et appuie sur la touche « OK », ou lorsqu’il appuie sur Entrée après avoir rempli les autres champs. Une autre solution consiste à inclure le champ dans l’ordre de tabulation tout en le désactivant. Il sera alors activé si cela s’avère approprié au vu des valeurs saisies par l’utilisateur dans les autres champs.
- L'étiquette du champ peut comporter un raccourci clavier permettant de déplacer le focus vers ce champ.
Une autre exception à la prise en charge de ` Tab ` concerne les widgets de saisie de texte qui doivent prendre en charge l’insertion de tabulations ; la quasi-totalité des éditeurs de texte entrent dans cette catégorie. Qt traite Ctrl+Tab comme Tab et Ctrl+Shift+Tab comme Shift+Tab; ces widgets peuvent réimplémenter QWidget::event() et gérer la touche Tab avant d’appeler QWidget::event() pour obtenir un traitement normal de toutes les autres touches. Cependant, comme certains systèmes utilisent Ctrl+Tab à d’autres fins et que de nombreux utilisateurs ne connaissent pas Ctrl+Tab de toute façon, ce n’est pas une solution complète.
L’utilisateur clique sur un widget
Cette situation est peut-être encore plus courante que d’appuyer sur Tab sur des ordinateurs équipés d’une souris ou d’un autre périphérique de pointage.
Cliquer pour déplacer le focus est légèrement plus puissant que la combinaison Tab. Non seulement cela déplace le focus vers un widget, mais pour les widgets d'édition, cela déplace également le curseur de texte (le focus interne du widget) à l'endroit où l'on a cliqué avec la souris.
Comme cette pratique est très courante et que les utilisateurs y sont habitués, il est judicieux de la prendre en charge pour la plupart des widgets. Cependant, il existe également une raison importante de l’éviter : vous ne souhaitez peut-être pas retirer le focus du widget sur lequel il se trouvait.
Par exemple, dans un traitement de texte, lorsque l’utilisateur clique sur le bouton « B » (gras), que doit-il advenir du focus clavier ? Doit-il rester là où il était, très certainement dans le widget d’édition, ou doit-il se déplacer vers le bouton « B » ?
Nous vous conseillons de prendre en charge le « click-to-focus » pour les widgets permettant la saisie de texte, et de l’éviter pour la plupart des widgets où un clic de souris a un effet différent. (Pour les boutons, nous recommandons également d’ajouter un raccourci clavier : la classe QAbstractButton et ses sous-classes facilitent grandement cette opération.)
Dans Qt, seule la fonction QWidget::setFocusPolicy() affecte le « click-to-focus ».
L'utilisateur appuie sur un raccourci clavier
Il n’est pas rare que des raccourcis clavier déplacent le focus. Cela peut se produire implicitement lors de l’ouverture de boîtes de dialogue modales, mais aussi explicitement à l’aide d’accélérateurs de focus tels que ceux fournis par QLabel::setBuddy(), QGroupBox et QTabBar.
Votre application peut prendre en charge le focus par raccourci pour tous les widgets vers lesquels l’utilisateur pourrait souhaiter se rendre. Par exemple, une boîte de dialogue à onglets peut disposer de raccourcis clavier pour chacune de ses pages, de sorte que l’utilisateur puisse appuyer, par exemple, sur Alt+P pour accéder à la page Impression. Gardez à l’esprit qu’il est facile d’en faire trop, car il n’y a qu’un nombre limité de touches, et qu’il est également important de fournir des raccourcis clavier pour les commandes. Reportez-vous aux directives de conception de la plateforme que vous ciblez, par exemple les directives de Microsoft pour la conception d’interfaces utilisateur au clavier ou les directives d’Apple concernant le focus et la sélection.
L’utilisateur fait tourner la molette de la souris
Sous Microsoft Windows, l'utilisation de la molette de la souris est toujours gérée par le widget qui détient le focus clavier. Sous macOS et X11, elle est gérée par le widget qui reçoit les autres événements de souris.
Qt gère cette différence entre les plateformes en permettant aux widgets de déplacer le focus clavier lorsque la molette est utilisée. Avec une politique de focus adaptée à chaque widget, les applications peuvent fonctionner correctement et de manière idiomatique sous Windows, macOS et X11.
L'utilisateur déplace le focus vers cette fenêtre
Dans ce cas, l’application doit déterminer quel widget de la fenêtre doit recevoir le focus.
Cela peut être simple : si le focus s’est déjà trouvé dans cette fenêtre, le dernier widget à l’avoir reçu doit le récupérer. Qt s’en charge automatiquement.
Si le focus n’a jamais été sur cette fenêtre auparavant et que vous savez où il doit se trouver au départ, appelez ` QWidget::setFocus()` sur le widget qui doit recevoir le focus avant d’appeler ` QWidget::show()` sur celui-ci. Si vous ne le faites pas, Qt choisira un widget approprié.
© 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.