Focus clavier dans les widgets
Les widgets de Qt Widgets gèrent la focalisation du clavier d'une manière qui est devenue habituelle dans les interfaces graphiques.
Le problème de base est que les frappes de l'utilisateur peuvent être dirigées vers n'importe quelle fenêtre de l'écran, et n'importe quel widget à l'intérieur de la fenêtre visée. Lorsque l'utilisateur appuie sur une touche, il s'attend à ce qu'elle aille au bon endroit, et le logiciel doit essayer de répondre à cette attente. Le système doit déterminer l'application vers laquelle la touche est dirigée, la fenêtre de cette application et le widget de cette fenêtre.
Mouvement de focalisation
Les coutumes qui ont évolué pour diriger le focus du 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 sur une fenêtre et l'application doit déterminer quel widget de la fenêtre doit recevoir le focus.
Chacun de ces mécanismes de mouvement est différent, et différents types de widgets ne reçoivent le focus que dans certains d'entre eux. Nous allons aborder chacun d'entre eux tour à tour.
Tab ou Shift+Tab
L'appui sur Tab est de loin la manière la plus courante de déplacer le focus à l'aide du clavier. (Parfois, dans les applications de saisie de données, Enter fait la même chose que Tab; ceci peut être facilement réalisé dans Qt en implémentant un filtre d'événement).
En appuyant sur Tab, dans tous les systèmes de fenêtres couramment utilisés aujourd'hui, le focus du clavier est déplacé vers le widget suivant dans une liste circulaire par fenêtre. Tab déplace le focus le long de la liste circulaire dans une direction, Shift+Tab dans l'autre. L'ordre dans lequel les touches Tab se déplacent d'un widget à l'autre s'appelle l'ordre de tabulation.
Vous pouvez personnaliser l'ordre de tabulation en utilisant QWidget::setTabOrder(). (Si vous ne le faites pas, Tab déplace généralement le focus dans l'ordre de construction du widget.) Qt Widgets Designer permet de modifier visuellement l'ordre des onglets.
Étant donné qu'il est courant d'appuyer sur Tab, la plupart des widgets qui peuvent avoir le focus devraient supporter le focus tabulation. La principale exception concerne les widgets qui sont rarement utilisés et pour lesquels il existe un accélérateur de clavier ou un gestionnaire d'erreur qui 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 un pour cent des cas. Dans une telle boîte de dialogue, Tab pourrait ignorer ce champ et la boîte de dialogue pourrait utiliser l'un de ces mécanismes :
- Si le programme peut déterminer si le champ est nécessaire, il peut y déplacer le focus lorsque l'utilisateur termine sa saisie et appuie sur OK, ou lorsque l'utilisateur appuie sur Entrée après avoir rempli les autres champs. Une autre solution consiste à inclure le champ dans l'ordre de tabulation mais à le désactiver. Activez-le s'il devient approprié au vu de ce que l'utilisateur a défini dans les autres champs.
- L'étiquette du champ peut inclure un raccourci clavier qui déplace le curseur sur 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 ; presque tous les éditeurs de texte appartiennent à cette catégorie. Qt Widgets traite Ctrl+Tab comme Tab et Ctrl+Shift+Tab comme Shift+Tab, et de tels widgets peuvent réimplémenter QWidget::event() et gérer 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 de toute façon pas Ctrl+Tab, cette solution n'est pas complète.
L'utilisateur clique sur un widget
C'est peut-être encore plus courant que d'appuyer sur Tab sur les ordinateurs équipés d'une souris ou d'un autre dispositif de pointage.
Cliquer pour déplacer le focus est légèrement plus puissant que Tab. Bien que cela déplace le focus vers un widget, pour les widgets d'éditeur, cela déplace également le curseur de texte (le focus interne du widget) à l'endroit où la souris a été cliquée.
Étant donné que cette méthode est très répandue et que les gens y sont habitués, c'est une bonne idée de la prendre en charge pour la plupart des widgets. Cependant, il existe également une raison importante de l'éviter : il se peut que vous ne souhaitiez pas retirer le focus du widget à l'endroit où il se trouvait.
Par exemple, dans un traitement de texte, lorsque l'utilisateur clique sur le bouton d'outil "B" (gras), que doit-il arriver au focus clavier ? Doit-il rester là où il se trouvait, très certainement dans le widget d'édition, ou doit-il se déplacer vers le bouton "B" ?
Nous conseillons d'accepter le clic de mise au point pour les widgets qui permettent 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 : QAbstractButton et ses sous-classes rendent cela très facile).
Dans Qt XML, seule la fonction QWidget::setFocusPolicy() affecte le clic de mise au point.
L'utilisateur appuie sur un raccourci clavier
Il n'est pas rare que les raccourcis clavier déplacent le focus. Cela peut se produire implicitement en ouvrant des boîtes de dialogue modales, mais aussi explicitement en utilisant des accélérateurs de focus tels que ceux fournis par QLabel::setBuddy(), QGroupBox, et QTabBar.
Votre application peut prendre en charge les raccourcis pour tous les widgets auxquels l'utilisateur peut vouloir accéder. Par exemple, une boîte de dialogue à onglets peut avoir des raccourcis clavier pour chacune de ses pages, de sorte que l'utilisateur puisse appuyer par exemple sur Alt+P pour passer à la page Impression.Gardez à l'esprit qu'il est facile d'en faire trop, puisqu'il n'y a que quelques touches, et qu'il est également important de fournir des raccourcis clavier pour les commandes. Reportez-vous aux directives de conception de la plate-forme que vous visez, par exemple les directives de Microsoft pour la conception d'interfaces utilisateur au clavier ou les directives d'Apple pour la mise au point 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 a la priorité sur le clavier. Sous macOS et X11, elle est gérée par le widget qui reçoit les autres événements de la souris.
La façon dont Qt Widgets gère cette différence de plateforme est en laissant les widgets déplacer le focus du clavier lorsque la molette est utilisée. Avec la bonne politique de focus sur chaque widget, les applications peuvent fonctionner correctement sous Windows, macOS et X11.
L'utilisateur déplace le focus sur cette fenêtre
Dans cette situation, l'application doit déterminer quel widget de la fenêtre doit recevoir le focus.
Cela peut être simple : Si le focus a déjà été dans cette fenêtre, alors le dernier widget à avoir le focus doit le récupérer. Qt le fait automatiquement.
Si le focus n'a jamais été dans cette fenêtre auparavant et que vous savez où le focus doit commencer, appelez QWidget::setFocus() sur le widget qui doit recevoir le focus avant d'appeler QWidget::show() celui-ci. Si vous ne le faites pas, Qt Widgets 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.