Se connecter avec
S'enregistrer | Connectez-vous

[C++] [Qt] Mouse Event

Dernière réponse : dans Programmation

Bonjour,

J'ai des soucis avec les evenements de la souris sur mon programme.
J'explique:
J'ai une classe MainWindow qui est décomposé en gridLayout.
Dans ma zone centrale, j'ai instancié une classe MarquageArea qui est elle même composé de 2 petites classe zoneImage à l'aide d'un gridLayout.

J'espere que le "schéma explicatif" de mon programme est compréhensible.

Le problème est donc le suivant:
Je cherche à donner un evenement souris à mes zoneImage. Un Clique sur une zoneImage permet d'ouvrir une fenetre.

Dans ma classe zoneImage, j'ai bien redéfini la fonction mousePressEvent mais celà ne fonctionne pas.

Merci d'avance ;) 

Autres pages sur : mouse event

Lassé par la pub ? Créez un compte
Expert Programmation

En fait c'est dans ta MainWindow que tu fais tonZoneImage->grabMouse(), ça indique que c'est ce widget qui va récupérer tous les évènements souris. Le problème c'est que plus rien d'autre ne prendra la souris.
Si tu gère des évènements dans la fenêtre parent, c'est ce qui te bloque: l'event est géré par le parent et pas renvoyé aux enfants.

Dans ma fenêtre parent, je gère des actions sur des boutons uniquement.
J'ai redéfini mousePressEvent dans ma classe zoneImage
j'ai fait monMarquageArea->maZoneImage->grabMouse() dans mon constructeur de MyMainWindow et cela ne fonctionne pas, ça bug.
Expert Programmation

Si je me souviens bien, il suffit que tu gères un handler (pas forcément de souris) dans une fenêtre pour que celle-ci récupère tous les évènements souris.

J'ai regardé la doc, et j'ai retrouvé ce qu'il fallait faire. Tu gardes ton mousePressEvent dans ZoneImage, mais dans la classe parent, tu dois définir un filtre sur les évènements qu'un widget (ta MainWindow) à renvoyer sur les widgets enfants (tes Zone image).
Pour cela, tu dois faire appel à la méthode installEventFilter() sur tous les widgets enfants susceptibles de récupérer l'évènement, et faire le filtre en surchargeant la méhtode eventFilter() dans ta MainWindow. Donc avec taZoneImage->installEventFilter(taMainWindow), tu va pouvoir rediriger tous les event que tu souhaites.
http://doc.qtsoftware.com/4.5/qobject.html#eventFilter

Pffiou, finalement j'ai changé complètement la structure de mon programme (j'ai tout mis dans la même classe) et j'ai utilisé les event filter et ça marche bien :) 

Par contre, une autre question, jme suis documenté mais j'ai pas réussi à trouver:

J'ai crée des onglets avec QTabWidget et j'aimerai qu'un bouton s'affiche lorsque je change d'onglet. Il faudrait que je redéfinise une fonction je suppose, mais je vois pas laquelle.

Merci
Expert Programmation

Je considère que le bouton n'est pas créé dans les onglet, mais à l'extérieur. Alors, il te faut faire ton propre slot, et faire un connect du signal de changement d'onglet sur ton slot. Dans ton slot tu peux créer un bouton.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde