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 :

Activer showEvent avant QDialog [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut Activer showEvent avant QDialog
    Bonjour à tous

    Désolé pour le titre, je n'ai pas trouvé de formulation plus simple. Voilà mon souci: j'ai une application qui doit ouvrir une sous-fenêtre à son ouverture. Pour ce faire, je surcharge la méthode show() pour qu'elle affiche la sous-fenêtre quand la fenêtre principale s'ouvre => ça fonctionne super (exemple ci-dessous)
    Code python : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import sys
     
    # L'objet pour gérer ma fenêtre
    class myWidget(QDialog):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
    	# __init()
     
    	def show(self):
    		print("show")
    		super().show()
    		self.__subWin()
    	# show()
     
    	def __subWin(self):
    		QMessageBox.information(self, "sub", "Hello", QMessageBox.Ok)
    # class myWidget
     
    if __name__ == "__main__":
    	app=QApplication(sys.argv)
     
    	widget=myWidget()
    	widget.show()
     
    	sys.exit(app.exec_())
    # if

    Toutefois il existe plusieurs façons d'ouvrir un fenêtre (show, open, exec_). Obligé si je veux tout gérer de surcharger chacune de ces méthodes. Ca me convient moyennement

    Il existe cependant une méthode showEvent() qui est appelée chaque fois que la fenêtre est ouverte. Je me dis "oh sympa, je n'ai qu'à la surcharger et quelle que soit mon ouverture, je passerai au final par cette méthode", donc acte
    Code python : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import sys
     
    # L'objet pour gérer ma fenêtre
    class myWidget(QDialog):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
    	# __init()
     
    	def showEvent(self, event):
    		print(event)
    		super().showEvent(event)
    		self.__subWin()
    	# showEvent()
     
    	def __subWin(self):
    		QMessageBox.information(self, "sub", "Hello", QMessageBox.Ok)
    # class myWidget
     
    if __name__ == "__main__":
    	app=QApplication(sys.argv)
     
    	widget=myWidget()
    	widget.show()
     
    	sys.exit(app.exec_())
    # if

    Ca marche... mais le souci c'est que la sous-fenêtre s'ouvre avant que la fenêtre principale s'affiche à l'écran. Pourtant j'ai bien veillé à appeler showEvent() du parent avant l'ouverture de la sous-fenêtre... mais rien n'y fait.

    Je ne dis pas que c'est un problème super grave (de toute façon j'utilise quasiment toujours show() et/ou je peux surcharger aussi les autres) mais bon ça me titille quand-même car j'aimerais nien savoir s'il y a une solution pour que le showEent() du parent affiche d'abord le parent afin que le QDialog s'ouvre dans une application bien ouverte à l'écran.

    Merci à tous.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    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 Sve@r


    D'après ce que je comprends, showEvent est lancé AVANT l'affichage effectif, ce qui explique que la méthode "__subWin" qui affiche la 2ème fenêtre soit lancée avant l'affichage de la 1ère fenêtre.
    Voir la doc: https://doc.qt.io/qt-5.15/qwidget.html#showEvent

    Par contre, le 1er code proposé avec "show" a l'air de donner satisfaction (1ère fenêtre affichée avant la 2ème).

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    hello,
    je rejoins ce que dit Tyrtamos :
    le souci, c'est que ton showEvent ne se termine pas tant que la fenêtre de dialogue n'est pas fermée et cela empêche l'affichage de la fenêtre principale.
    Une solution consiste à utiliser un show pour la fenêtre de Dialogue car celui-ci n'est pas bloquant. Avec le Show/Hide on visualise ou pas une fenêtre déjà créée. Voici un code qui crée et montre une fenêtre de dialogue équivalente à ta fenêtre d'information :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def __subWin(self):
        msg = QMessageBox(self)
        msg.setIcon(QMessageBox.Information)
        msg.setText("Hello")
        msg.setWindowTitle("sub")
        msg.show()
    chez moi avec ce code la fenêtre principale est bien affichée en même temps que la fenêtre de dialogue. Avec un exec à la place du show cela coince.


    Ami calmant, J.P

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    D'après ce que je comprends, showEvent est lancé AVANT l'affichage effectif, ce qui explique que la méthode "__subWin" qui affiche la 2ème fenêtre soit lancée avant l'affichage de la 1ère fenêtre.
    Oui ça semble logique.

    Citation Envoyé par tyrtamos Voir le message
    Par contre, le 1er code proposé avec "show" a l'air de donner satisfaction (1ère fenêtre affichée avant la 2ème).
    Oui, c'est ce que j'utilise actuellement. Je dis pas que ça me convient pas, mais s'il y avait eu mieux...

    Citation Envoyé par jurassic pork Voir le message
    Une solution consiste à utiliser un show pour la fenêtre de Dialogue car celui-ci n'est pas bloquant. Avec le Show/Hide on visualise ou pas une fenêtre déjà créée.
    Effectivement, ce code fonctionne. En fait la sous-fenêtre s'affiche avant mais comme cet affichage n'est pas bloquant, la fenêtre principale s'ouvre en même temps et les fenêtres se rejoigent à l'affichage. C'est pas mal. Bon l'inconvénient c'est que là c'est un exemple minimaliste tandis que dans mon appli le QMessageBox attend des infos de connexion à la bdd et donc il doit bloquer tant qu'on n'a pas rempli les valeurs et validé => on retombe dans le cas de départ => si ça bloque, alors la fenêtre principale ne s'affiche pas.

    Mais c'est sympa d'avoir essayé. En fait le souci bien résumé par tyrtamos c'est que showEvent() est appelé avant l'affichage effectif...

    A+
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    dans mon appli le QMessageBox attend des infos de connexion à la bdd et donc il doit bloquer tant qu'on n'a pas rempli les valeurs et validé =>
    Dans mon exemple la fenêtre de dialogue QMessageBox est modale donc tu ne peux rien faire dans la fenêtre principale tant que cette fenêtre n'est pas fermée.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Dans mon exemple la fenêtre de dialogue QMessageBox est modale donc tu ne peux rien faire dans la fenêtre principale tant que cette fenêtre n'est pas fermée.
    Oui tout à fait. Je pense que c'est ma fenêtre de connexion qui est mal foutue car elle ne fonctionne que si je l'appelle via exec_(). Si je l'ouvre avec show(), elle retourne immédiatement une valeur.
    A mon avis, si je l'écris différemment ça peut marcher.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [AC-2010] Activation formulaire avant emploi
    Par nono63 dans le forum IHM
    Réponses: 3
    Dernier message: 06/03/2012, 18h17
  2. [VBA-E] activer apercu avant impression
    Par mapmip dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/02/2007, 18h29
  3. Réponses: 6
    Dernier message: 04/06/2006, 19h02
  4. fermer toutes fenetres active de l'application avant quitter
    Par iam dans le forum Bases de données
    Réponses: 0
    Dernier message: 03/06/2006, 11h42
  5. Réponses: 7
    Dernier message: 10/02/2006, 15h22

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