# PyQt/Gestion du focus

La gestion du focus clavier sous Qt est assez similaire aux autres environnements graphiques. Elle s'effectue lors de différentes actions, listées ci-dessous avec une courte explication de leur fonctionnement et comment les gérer en Qt. Il est possible, pour chaque widget, de définir à quelles actions il doit réagir. Cela s'effectue par l'appel à la méthode setFocusPolicy, prenant en paramètre le type de focus pour lequel le widget doit réagir.

## L'utilisateur se déplace d'un widget à l'autre avec les touches tab et shift + tab

Il s'agit de l'action la plus courante, l'utilisateur désirant par exemple se déplacer d'un champ de saisie à l'autre dans un formulaire. Le principe de ces combinaisons de touches est de se déplacer circulairement entre les widgets, il y a donc une relation d'ordre. Bien évidemment, en tant que développeur vous pouvez choisir quels widgets répondent à ces actions ainsi que l'ordre de déplacement. Pour que votre widget réponde à ce type de focus, définissez la politique de focus à QWidget.TabFocus. De plus, l'ordre est modifiable par la méthode statique QWidget.setTabOrder.

## L'utilisateur clique sur un widget

Le clic pour obtenir le focus est une autre action très courante pour l'utilisateur, il est donc important que votre application le supporte. Cependant il faut bien paramétrer cela faute d'avoir un comportement étrange. Prenons l'exemple d'un éditeur de texte comportant un bouton permettant de mettre un texte en gras. Il faut donc que le bouton réponde au clic, mais pas au focus, faute de quoi le focus reste sur le bouton et l'utilisateur de votre application est quelque peu dérouté. Par conséquent, la recommandation de la documentation de référence est de désactiver le focus par un clic sur les widgets tels que les boutons. L'activation de ce focus s'effectue par la politique QWidget.ClickFocus. Remarque Il est possible d'activer le focus avec un clic et le focus avec les touches Tab et Shift + Tab en définissant la politique de focus à QWidget.StrongFocus.

## L'utilisateur utilise un raccourci clavier

Il est aussi fréquent que le focus se déplace lors de l'utilisation d'un raccourci clavier, si par exemple une fenêtre de dialogue s'ouvre. La documentation de référence suggère donc fortement de gérer le focus lors de raccourcis claviers aussi.

## L'utilisateur utilise la roulette de défilement de sa souris

Cette méthode est moins commune, surtout vu son fonctionnement différent entre les diverses plateformes supportées. Sous Microsoft Windows c'est le widget ayant le focus clavier qui reçoit les événements de la souris, tandis que sous X11 et Mac OS X c'est le widget gérant tous les événements de la souris qui reçoit ces informations. Qt gère le focus de la roulette en permettant au focus du clavier de se déplacer lorsque l'utilisateur utilise la roulette de défilement de sa souris. En mettant une politique correcte sur les widgets, le fonctionnement de l'application sur les plateformes supportées sera identique. Pour activer ce focus, il faut lui mettre QWidget.WheelFocus, qui active par la même occasion le focus défini par QWidget.StrongFocus.

## L'utilisateur active la fenêtre de l'application

Une autre question à se poser lors du développement d'une application est de savoir quel widget va recevoir le focus lors de l'ouverture de l'application, mais aussi lorsque l'utilisateur met la fenêtre en avant-plan. Cependant, cette partie est assez simple à mettre en place. Si l'utilisateur met la fenêtre en avant-plan, le dernier élément à avoir le focus avant la mise en arrière-plan récupère le focus, car Qt gère cela automatiquement. Pour définir quel widget doit obtenir le focus lors de l'ouverture de la fenêtre, il suffit d'utiliser la méthode setFocus avec comme paramètre le widget voulu. Celui ci aura automatiquement le focus lors de l'appel à show.

## Aucun focus pour le widget

Il est aussi possible de définir un widget de telle sorte à ce qu'il ne puisse pas obtenir le focus. Cela est obtenu avec la politique de gestion de focus QWidget.NoFocus. Pour plus de détails quant à la gestion de focus nous vous invitons à consulter le guide de la documentation de référence à l'adresse http://doc.trolltech.com/3.3/focus.html.