Bonjour tout le monde,
je suis actuellement confronté à un problème de gestion globale d'événements à l'intérieur de mon application. Je m'explique :
J'ai en partie dans ma fenêtre principale des zones de saisie avec à côté deux boutons (incrémentation/décrémentation de la valeur de la zone de saisie avec un pas par défaut de 1). Lorsque la touche SHIFT du clavier est enfoncée, le pas passe à 10. Jusqu'ici le comportement est simple.
Je ré-implémente donc dans mes boutons les méthodes KeyPressEvent() et KeyReleaseEvent() pour affecter respectivement les valeurs true et false à ma variable membre isShiftPressed.
Seulement, imaginons maintenant que je veuille enfoncé shift avant de cliquer sur le bouton. Je m'aperçois alors que le pas est toujours de 1, le bouton n'ayant pas eu le focus au moment de l'appui sur SHIFT et la méthode KeyPressEvent() du bouton n'ayant donc pas été appelée.
L'événement doit donc être géré de façon plus globale dans mon application, d'autant plus que ce n'est surement pas le seul composant qui aura besoin de connaître l'état de cette touche.
Je vois alors plusieurs solutions mais je souhaiterais avoir votre avis sur la meilleure à utiliser (qui ne fait pas forcément parti de l'une d'entre elles :p ) :
1) Gérer les événements "globaux" au niveau de windows (appli windows ici mais cette méthode me paraît lourde).
2) Utiliser une variable globale isShiftPressed pour que l'état soit connu partout et modifier dans les widgets sa valeur via les événements KeyPressEvent() et KeyReleaseEvent() .
3) Utiliser un eventFilter pour filtrer les événements (événement qui serait a priori inclus dans la fenêtre principale mais cela impliquerait que celle-ci doit toujours être le widget focus sinon la méthode n'est plus appelée, donc que si je clic sur un bouton, Qt lui donnant par défaut le focus, je dois forcer le focus pour le rendre à ma fenêtre principale... ça fait un peu trop bidouille à mon goût ^^) (Edit : ce dernier comportement peut en fait être évité grâce à la méthode setFocusPolicy(Qt::NoFocus) pour garder le focus sur la fenêtre principale mais j'aurais besoin d'avoir le focus sur un certain nombre de widget pour faire appel à leurs événements... Dans ce cas là, si ces widgets ont le focus, que je maintiens shift (donc que la fenêtre principale ne met pas à jour l'enfoncement de la touche), et que je viens cliquer sur un bouton, je me retrouve au point de départ).
4) Reprendre l'idée du 3) mais en ré-implémentant plutôt event(). Mais le 3) et 4) semble être inapproprié ici au final parce que j'ai besoin de permettre le focus des composants intérieurs (sinon appel à mouseMoveEvent() d'un widget impossible non? ou alors redistribution possible mais ça risque d'être lourd de toujours tester la position du curseur pour voir à quel composant on veut s'adresser et donc quel événement on veut véritablement appelé..)
J'ai l'impression que je n'ai pas trouvé encore la meilleure solution à ce problème. Je suis à l'écoute de tous vos conseils
Merci beaucoup !
Partager