-
Fenêtre QDialog bloquée
Bonjour,
J'ai créé une pop up pour mon programme sous la forme d'une fenêtre QDialog.
Je rencontre un problème quand j'affiche la fenêtre (avec .show()), la fenêtre semble "bloquée"; impossible de déplacer la fenêtre ou de cliquer sur un bouton présent dans la fenêtre.
J'ai vérifié que la QDialog est bien active au moyen de setEnabled() et isEnabled() mais il semble que la fenêtre ne reçoive aucun event de la souris ou du clavier.
Une idée?
Merci
-
En général une fenêtre/boîte de dialogue qui ne répond plus, c'est le code qui bloque, c'est à dire du code qui est long à s'exécuter et empêche la gestion des évènements graphiques d'être effectuée. Est-ce que c'est le cas ? (dans ce cas ton application entière ne devrait plus répondre)
-
Oui effectivement, l'application totale est bloquée.
J'ai une fonction qui est exécutée et qui visiblement bloque le tout. Cependant, quand celle-ci se termine, je devrais tout de meme récupérer mon application. Mais visiblement, la fenêtre qdialog est toujours bloquée.
J'ai fait une boucle while d'attente d'où on ne sort que si un bouton de la fenêtre qdialog est pressé. La pop up est alors supprimée.
Malheureusement, le bouton est dans mon cas inutilisable vu que la fenêtre est bloquée.
-
Exact ! La boucle while n'est pas utilisable pour ce genre de cas, il faut fonctionner différemment avec les interfaces graphiques, mais Qt fournit tout ce qu'il faut pour ça.
Il y a plusieurs manières de faire. Si tu veux simplement que ta pop up "bloque" la fenêtre principale, il faut alors l'ouvrir en modale plutôt qu'en modeless :
http://qt.developpez.com/doc/4.6/qdialog/#details
Si tu veux attendre un certain bouton avant d'effectuer quoi que ce soit, je pense que le plus logique serait de griser tous les autres widgets de ta boite de dialogue, et de les réactiver lorsqu'on clique sur le bouton.
Dans tous les cas, il faut bannir l'utilisation de boucle d'attente, et penser "évènements" ;)
-
Mais je ne vois pas trop comment faire pour attendre avec ma pop up ouverte sans boucle while.
En fait, je crée ma pop up dans une fonction spécifique puis je la détruis juste avant de sortir de cette fonction quand on appuie sur le bouton en question.
Il faudrait donc que je check en continu l'état du bouton avant d'effectuer le return de la fonction et de détruire la pop up?
Jusqu'à présent, j'avais fait créé un flag que je vérifiais dans la boucle while et qui était assigné quand le bouton était pressé. Ce n'est donc pas la bonne manière de procéder...
-
Il faut oublier cette manière de faire avec les interfaces graphiques, ou même dans tout programme qui doit gérer plusieurs choses en même temps. Dans ton cas précis tu peux "attendre" qu'une boite de dialogue soit fermée/validée dans le corps d'une fonction avec http://qt.developpez.com/doc/latest/qdialog/#exec
Mais d'un point de vue plus général, il faudra parfois découper ton code dans plusieurs fonctions. Une fonction créant une fenêtre etc, et une fonction appelée avec un certain évènement (clic de bouton, un certain temps écoulé etc).