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 :

[PyQt]un slot qui récupère plusieurs signaux


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut [PyQt]un slot qui récupère plusieurs signaux
    Bonjour,

    je crée un widget dans lequel je met plusieurs champs à saisir par l'utilisateur. Je met un pyqtsignal sur ce widget qui emet un booléen pour me dire si tous les champs saisis sont bien conforme à ce qui est attendu.

    dans ma fenêtre principale, j'ai un widget de type QTabWidget où chaque onglet est un élement widget crée précédement.
    Comment mettre un slot sur le QTabWidget qui dirait si tous les onglets sont valides?
    (Le nombre d'onglets est variables, j'ai mis dans l'interface des boutons qui permettent d'ajouter et de supprimer des onglets)

    Merci,
    Nico

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Comment l'interface passe/navigue d'un onglet à l'autre? Que se passe-t-il si la saisie d'un onglet n'est pas valide?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Un onglet non valide ne bloque pas le passage à l'onglet d'à côté par l'utilisateur.
    Si un onglet n'est pas valide, j'affiche un icône warning à côté du label de l'onglet et je met à jour le signal de l'onglet à False

    Nico

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    Un onglet non valide ne bloque pas le passage à l'onglet d'à côté par l'utilisateur.
    Si un onglet n'est pas valide, j'affiche un icône warning à côté du label de l'onglet et je met à jour le signal de l'onglet à False
    Difficile alors de ne pas tester l'état de chaque onglet.... et pas évident que les signaux apportent quoi que ce soit dans ce cas.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    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 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par DiverSIG Voir le message
    je crée un widget dans lequel je met plusieurs champs à saisir par l'utilisateur. Je met un pyqtsignal sur ce widget qui emet un booléen pour me dire si tous les champs saisis sont bien conforme à ce qui est attendu.
    Comment mettre un slot sur le QTabWidget qui dirait si tous les onglets sont valides?
    Dans le QTabWidget tu crées un tableau pour chaque widget (ou mieux, un dictionnaire où le widget serait la clef). Et tout à faux.
    Quand tu reçois un signal d'un des widgets, tu places son élément correspondant à vrai ou faux selon la valeur du signal. Le QSignalMapper peut t'aider à identifier quel widget a émis le signal qui arrive dans le QTabWidget.
    Et quand tous les éléments du dico sont à vrai, tous les widgets sont valides.
    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]

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et quand tous les éléments du dico sont à vrai, tous les widgets sont valides.
    A la fin, il y aura toujours une boucle qui devra tester l'état de chaque widget.... et il est toujours préférable de tester cet état via un attribut/property de l'objet directement plutôt que de se poser des questions sur la "fraicheur" de la copie de cet état.
    Après, on fait ce qu'on veut: c'est votre code et ce sera à vous de debugger.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    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 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    A la fin, il y aura toujours une boucle qui devra tester l'état de chaque widget....
    Juste du tableau (enfin du dictionnaire)

    Citation Envoyé par wiztricks Voir le message
    et il est toujours préférable de tester cet état via un attribut/property de l'objet directement plutôt que de se poser des questions sur la "fraicheur" de la copie de cet état.
    Ca se discute. Si le signal est émis à la modification du widget, alors s'il n'est pas émis émis c'est que le widget n'est pas modifié.
    Parce que oui ok mettre une méthode au widget qui checke s'il est valide ou pas c'est faisable. Mais comment dire au QTabDialog d'aller interroger ladite méthode? Quand le widget a été modifié (c'est ce qui me semble le plus logique). Donc là ça passe par un signal.
    Donc s'il y a signal, autant lui rajouter une info valide/pas valide. Ce qui, en plus, ne change pas grand chose car le widget, pour envoyer l'info, devra d'abord déterminer s'il est valide et donc devra faire une introspection qui peut être codée dans ladite méthode. Sauf que la méthode peut rester privée, nul n'a besoin d'y accéder.
    Ainsi chaque fois que le widget évolue il envoie un signal "j'ai été modifié et je suis ok" ou "j'ai été modifié et suis pas ok" et quiconque récupère ce signal sait en même temps l'état du widget.
    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]

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mais comment dire au QTabDialog d'aller interroger ladite méthode? Quand le widget a été modifié (c'est ce qui me semble le plus logique). Donc là ça passe par un signal.
    Et par quelle magie, l'état du QTabDialog rendant compte de tous les onglets sera pris en compte?
    Les interfaces entre instances ne se réduisent pas à des signaux!

    Citation Envoyé par Sve@r Voir le message
    Donc s'il y a signal, autant lui rajouter une info valide/pas valide. Ce qui, en plus, ne change pas grand chose car le widget, pour envoyer l'info, devra d'abord déterminer s'il est valide. Ce qui, en plus, ne change pas grand chose car le widget, pour envoyer l'info, devra d'abord déterminer s'il est valide et donc devra faire une introspection qui peut être codée dans ladite méthode.
    On appelle la méthode et on a le résultat...

    Enfin moi ce que je dis c'est que c'est lourd, mais on a le choix de la croix qu'on va devoir se trainer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    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 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et par quelle magie, l'état du QTabDialog rendant compte de tous les onglets sera pris en compte?
    Ce point particulier n'a pas été demandé par le PO. D'après ce que j'ai compris, le PO a n widgets regroupés dans un QTabWidget (désolé j'ai dit QTabDialog dans mon post précédent et tu as repris le terme mais en réalité il a bien dit "QTabWidget") et il veut juste, dans le QTabWidget, savoir si l'ensemble des n widgets sont valides ou pas.
    Le fait que le QTabWidget doive rendre compte de la validité de tous les onglets à une instance supérieure pas été demandé.

    Citation Envoyé par wiztricks Voir le message
    Les interfaces entre instances ne se réduisent pas à des signaux!
    Non, pas que. Mais là ça me semblait bien adapté. Parce que, comme je l'ai fait remarquer, pour que le QTabWidget sache qu'un sous-widget de saisie a évolué il faut fatalement que ce sous-widget de saisie émette un signal, non?

    Citation Envoyé par wiztricks Voir le message
    Enfin moi ce que je dis c'est que c'est lourd, mais on a le choix de la croix qu'on va devoir se trainer.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    #!/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 mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le QTabWidget
    		self.__mainWid=myTabWidget()
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec_(self):
    		# Affichage du widget principal
    		self.__mainWid.show()
     
    		# Appel méthode objet hérité
    		return super().exec_()
    	# exec_()
    # class myAppli
     
    # L'objet pour gérer le QTabWidget
    class myTabWidget(QTabWidget):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La fenêtre sera détruite à sa fermeture
    		self.setAttribute(Qt.WA_DeleteOnClose)
     
    		# Les widgets à gérer
    		self.__wid={
    			mySaisie(parent=self) : ["Saisie 1", False],
    			mySaisie(parent=self) : ["Saisie 2", False],
    			mySaisie(parent=self) : ["Saisie 3", False],
    		}
     
    		# Placement des widgets
    		for (k, v) in self.__wid.items():
    			self.addTab(k, v[0])
    			k.sigValid[bool].connect(self.__slotValid)
    		# for
    	# __init()
     
    	# Le slot qui vérifie la validité de l'ensemble des widgets
            @pyqtSlot(bool)
    	def __slotValid(self, check):
    		# On positionne le flag selon le widget ayant émis le signal
    		self.__wid[self.sender()][1]=check
     
    		# On affiche l'état du tabwidget selon l'ensemble des états
    		if not all(v[1] for v in self.__wid.values()):
    			QMessageBox.warning(
    				self,
    				"Etat invalide",
    				"Encore à compléter...",
    			)
    		else:
    			QMessageBox.information(
    				self,
    				"Etat ok",
    				"Enfin valide!!!",
    			)
    		# if
    	# __slotValid()
    # class myTabWidget
     
    # L'objet pour gérer une saisie de nom+prénom
    class mySaisie(QWidget):
    	sigValid=pyqtSignal(bool)
     
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La fenêtre sera détruite à sa fermeture
    		self.setAttribute(Qt.WA_DeleteOnClose)
     
    		# La zone de saisie nom+prénom
    		self.__nom=QLineEdit(parent=self)
    		self.__prenom=QLineEdit(parent=self)
     
    		# Positionnement des widgets
    		layout1=QHBoxLayout()
    		layout1.addWidget(self.__nom, stretch=0)
    		layout1.addWidget(self.__prenom, stretch=0)
     
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addLayout(layout1, stretch=0)
    		mainLayout.addStretch(1)
     
    		# On active les actions des widgets
    		self.__nom.textChanged[str].connect(self.__slotChanged)
    		self.__prenom.textChanged[str].connect(self.__slotChanged)
    	# __init__()
     
    	# Le slot qui traite tout changement
            @pyqtSlot(str)
    	def __slotChanged(self, t):
    		# Si le nom ou prénom sont vides
    		if not self.__nom.text() or not self.__prenom.text():
    			# Le widget est invalide
    			self.sigValid[bool].emit(False)
    			return
    		# if
     
    		# Le widget est valide
    		self.sigValid[bool].emit(True)
    	# __slotChanged()
    # class mySaisie
     
    # Dans le cas d'une exécution directe du script
    if __name__ == "__main__":
    	# L'application principale Qt
    	sys.exit(myAppli(sys.argv).exec_())
    # if
    Parfaitement fonctionnel, répondant aux besoins mentionnés par le PO (tels que je les ai compris). Et personnellement je ne trouve pas la gestion du QTabWidget super lourde.

    Le seul souci un peu chiant c'est qu'à chaque modif il apparait un QMessageBox indiquant l'état ok/pas ok. L'autre solution eut été de rajouter un widget permettant d'afficher le récapitulatif mais ça rajoutait à cette maquette de démonstration un élément inutile au POC.
    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]

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. Un slot qui ne récupère pas toutes les données
    Par bilou_2007 dans le forum Débuter
    Réponses: 0
    Dernier message: 18/04/2011, 22h03
  3. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43
  4. Réponses: 14
    Dernier message: 09/04/2004, 13h44
  5. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07

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