IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

QDialog : exec et hide ?


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut QDialog : exec et hide ?
    Bonsoir,

    je viens chercher conseil auprès de vous (toujours bon !).

    Voila actuellement mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        ### Creation de la fenetre
        GlobalVar["ProgressDialog"] = ProgressDialog(None, TotalSubtitles)
     
        ### Conversion des images en textes
        ## Création du thread
        MonProgressThread = ProgressThread()
     
        ## Connexion des signaux de progression et de fin du thread
        MonProgressThread.FinDuThread.connect(GlobalVar["ProgressDialog"].WorkFinish)
        MonProgressThread.ProgDuThread.connect(GlobalVar["ProgressDialog"].WorkProgression)
        MonProgressThread.PauseDuThread.connect(GlobalVar["ProgressDialog"].WorkPauseExt)
     
        ## Démarrage du thread
        MonProgressThread.start()
     
     
        ### Affichage de la fenêtre de progression
        GlobalVar["ProgressDialogClose"] = GlobalVar["ProgressDialog"].exec()
     
        ### Nettoyage du QThread ayant géré la conversion
        MonProgressThread.shutdown()
    le exec me permet donc de stopper temporairement la suite de commande.

    Ca fonctionne bien mais je voudrais ajouter l'affichage de la fenêtre facultative.

    la 1ere idée qui m'est venu est de la cacher avant de l’exécuter, mais cela ne fonctionne pas (dommage ça répondait à mes attentes :p).
    Ma 2eme idée est de modifier complètement le fonctionnement de mon soft en utilisant les signaux finished, accepted et rejected...

    Mais je me dis qu'il y a peut être une autre façon de faire plus simple :p

    Pour info que je l'affiche ou non, elle contient les même données et il y a des échanges d'infos à coup d'emit entre mon Thread et ma QDialog.

    en espérant avoir été clair (j'ai la tête en bouillie là) et dans l'attente de vos réponses, veuillez agréer...

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Bonsoir,

    je viens chercher conseil auprès de vous (toujours bon !).

    Voila actuellement mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        ### Conversion des images en textes
        ## Création du thread
        MonProgressThread = ProgressThread()
     
        ## Connexion des signaux de progression et de fin du thread
        MonProgressThread.FinDuThread.connect(GlobalVar["ProgressDialog"].WorkFinish)
        MonProgressThread.ProgDuThread.connect(GlobalVar["ProgressDialog"].WorkProgression)
        MonProgressThread.PauseDuThread.connect(GlobalVar["ProgressDialog"].WorkPauseExt)
     
        ## Démarrage du thread
        MonProgressThread.start()
     
     
        ### Affichage de la fenêtre de progression
        GlobalVar["ProgressDialogClose"] = GlobalVar["ProgressDialog"].exec()
     
        ### Nettoyage du QThread ayant géré la conversion
        MonProgressThread.shutdown()
    le exec me permet donc de stopper temporairement la suite de commande.
    Quel exec ?

    Ca fonctionne bien mais je voudrais ajouter l'affichage de la fenêtre facultative.
    Quelle fenêtre facultative ?

    la 1ere idée qui m'est venu est de la cacher avant de l’exécuter, mais cela ne fonctionne pas (dommage ça répondait à mes attentes :p).
    Ma 2eme idée est de modifier complètement le fonctionnement de mon soft en utilisant les signaux finished, accepted et rejected...

    Mais je me dis qu'il y a peut être une autre façon de faire plus simple :p

    Pour info que je l'affiche ou non, elle contient les même données et il y a des échanges d'infos à coup d'emit entre mon Thread et ma QDialog.

    en espérant avoir été clair (j'ai la tête en bouillie là) et dans l'attente de vos réponses, veuillez agréer...

    Franchement, Hizoka, tu es incompréhensible sur ce coup. Et qu'est-ce que ce GlobalVar["ProgressDialog"] ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Ouais désolé, pas beaucoup dormi avec ma garde... du coup je suis moins explicite que d’habitude... (quoi que...)

    Quel exec ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlobalVar["ProgressDialogClose"] = GlobalVar["ProgressDialog"].exec()
    C'est l’exécution de ma fenêtre QDialog

    Quelle fenêtre facultative ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlobalVar["ProgressDialogClose"] = GlobalVar["ProgressDialog"].exec()
    Je souhaite que l'affichage de cette fenêtre deviennent facultative, qu'elle reste présente mais cachée finalement...
    je voulais mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if blabla:
      GlobalVar["ProgressDialog"].hide()
    avant son execution.

    Et qu'est-ce que ce GlobalVar["ProgressDialog"] ?
    j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        ### Creation de la fenetre
        GlobalVar["ProgressDialog"] = ProgressDialog(None, TotalSubtitles)
    c'est ma fameuse fenêtre QDialog que je souhaite ne pas afficher.

    J’espère que quand je me relirai, une fois reposé, je ne me dirai pas : "Ouhaaa, carrément à l'ouest l'hizoka..." :p

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour hizoka,

    Les méthodes hide et show fonctionnent avec la fenêtre QProgressDialog, car elle hérite de QWidget.

    Je viens d'en faire l'essai de cette façon avec un de mes codes qui utilise un thread:

    - pour hide: j'ai sous-classé QProgressDialog pour lui ajouter un raccourci clavier: Alt-S => self.hide()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class ProgressDialog(QtWidgets.QProgressDialog):
     
        #========================================================================
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
     
        # =======================================================================
        def keyPressEvent(self, event):
            """raccourcis clavier
            """
            # Alt-S => cache la fenêtre QProgressDialog
            if event.key() == QtCore.Qt.Key_H and (event.modifiers() & QtCore.Qt.AltModifier):
                self.hide()
                event.accept()
            else:
                event.ignore()
    - Pour show(), quand la fenêtre de progressdialog est cachée, elle n'a plus le focus, et donc ne peut pas recevoir de commande clavier. J'ai donc ajouté le raccourci clavier à la fenêtre qui a lancé le progressdialog et qui a le focus quand cette fenêtre a été cachée: Als-S => self.prog.show()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        def keyPressEvent(self, event):
            """raccourcis clavier
            """
            # Alt-S => affiche la fenêtre QProgressDialog
            if event.key() == QtCore.Qt.Key_S and (event.modifiers() & QtCore.Qt.AltModifier):
                self.prog.show()
                event.accept()
            else:
                event.ignore()
    Avec ça, le test marche: pendant l'affichage de la progression, on cache et on ré-affiche la fenêtre de progression à volonté. Ce faisant, on voit bien que la fenêtre progressdialog continue à être active quand elle est cachée (=la barre de progression avance grâce au thread).

    La conclusion, c'est que tu dois trouver en fonction de ton code comment actionner hide() et show() pour que ça marche chez toi.

    Cependant, à mon avis, tu devrais essayer de lancer la fenêtre progressdialog avec show() et non exec(), car la méthode exec() met la fenêtre en mode "modal" exclusif, et il est possible que ça bloque ce genre de manip. En tout cas, c'est ce qui se passe chez moi. Si tu veux que la fenêtre soit modale, tu peux utiliser ceci avant le show():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.prog.setWindowModality(QtCore.Qt.ApplicationModal)

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut et merci de ta réponse.

    Pour info c'est une QDialog maison qui remplace la QProgressDialog, mais ça ne doit pas changer grand chose.

    Tu m'as donné l'idée de tester :
    execution de la fenêtre
    bouton hide
    => la fenêtre est considérée comme fermée, le code continue
    C'est l'explication du pourquoi du comment je ne peux la cacher et l’exécuter

    Il va donc falloir que je parte vers show() en effet mais du coup cela ne bloque pas mon code (comme le fait exec()) et donc ça fout en l'air mon fonctionnement linéaire (mes commandes suivantes sont exécutées avant la fermeture de la fenêtre).

    il faut donc que je modifie le fonctionnement de soft.


    EDIT : après tests, je ne vois pas trop comment faire.

    Et vu que je ne suis pas forcément très clair, ça sera peut être un peu plus facile pour vous de voir plus de commandes.

    Je me permets de vous joindre mon script (il reste du travail dessus, des modifications de noms de variables et autres)
    Ligne 1660, j'ai essayé de détailler le problème
    Si quelqu'un a une idée.

    Désolé si ça vous parait pas clair/logique et merci beaucoup à vous.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Il va donc falloir que je parte vers show() en effet mais du coup cela ne bloque pas mon code (comme le fait exec()) et donc ça fout en l'air mon fonctionnement linéaire (mes commandes suivantes sont exécutées avant la fermeture de la fenêtre)
    En fait, il y a une différence importante entre show() et exec(). Comme tu l'as vu, exec() ne fait pas que d'afficher la fenêtre de dialogue, elle bloque l'exécution des instructions suivantes, et en plus, elle exécute une boucle spéciale de traitement des évènements (et celle de la fenêtre normale ne s'exécute plus). D'habitude, c'est bien ce qu'on veut. Par exemple, pour demander un nom de fichier avec un QFileDialog qui n'est pas celui de l'OS, on utilise bien exec(), et les lignes d'instructions qui suivent attendent que la réponse ait été faite et la fenêtre de dialogue fermée pour continuer à s'exécuter.

    Ce n'est pas le cas ici: on veut lancer la fenêtre de dialogue pour avoir la barre de progression, mais le programme doit pouvoir continuer à s'exécuter!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Graphics View] Fermeture de QDialog impossible après exec()
    Par defrouille dans le forum Qt
    Réponses: 8
    Dernier message: 12/01/2011, 18h33
  2. [RUNTIME][EXEC]
    Par adrien1977 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 30/09/2009, 16h28
  3. [Free Pascal] Comportement de Exec
    Par néo333 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 01/11/2003, 17h46
  4. Comment utiliser Site Exec sous FTP
    Par phig dans le forum Développement
    Réponses: 2
    Dernier message: 12/08/2003, 17h11
  5. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo