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

Python Discussion :

Récupérer le n° de ligne QTableWidget avec une QCheckBox intégré


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 110
    Par défaut Récupérer le n° de ligne QTableWidget avec une QCheckBox intégré
    Bonjour,

    Débutant voir même, extrêmement novice avec Python, je viens de réussir à créer et alimenter via une BDD une QTableWidget.

    Certes, mon code est certainement loin d'être parfait mais pour le moment, il fonctionne plus ou moins.

    Pour des raisons d'esthétisme, j'utilise une feuille de style CSS qui, ajoute une image lors de la coche des QCheckBox.

    Si je vous parle de ça ! C'est tout simplement parce que j'ajoute à la QTableWidget, l'objet QCheckBox avec un appel de fonction lors du clique sur celle-ci.

    L'appel de la fonction lors du clique fonctionne correctement, cependant, pour les besoins de mon utilisation, je n'arrive pas à récupérer le n° de la ligne où est située la QCheckBox qui vient d'être cochée.

    Je vous note ci-dessous le code pour que cela soit le plus compréhensible pour vous.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
           # boucle de lecture de la requête
            try:
                while self.query.next():
                    # widget checkbox
                    checkbox_widget = QWidget()
                    checkbox_widget.setStyleSheet('background-color: transparent;')
     
                    layout_cb = QtWidgets.QHBoxLayout(checkbox_widget)
                    self.table_ep_cb = QtWidgets.QCheckBox()
                    layout_cb.addWidget(self.table_ep_cb)
                    layout_cb.setAlignment(Qt.AlignmentFlag.AlignCenter)
                    layout_cb.setContentsMargins(0, 0, 0, 0)
                    checkbox_widget.setLayout(layout_cb)
     
                    tablerow = self.table_ep.rowCount()
     
                    self.table_ep.insertRow(tablerow)
     
                    self.table_ep.setItem(tablerow, 0, QtWidgets.QTableWidgetItem((self.query.value('col1'))))
                    self.table_ep.setItem(tablerow, 1, QtWidgets.QTableWidgetItem((self.query.value('col2'))))
                    self.table_ep.setItem(tablerow, 2, QtWidgets.QTableWidgetItem((self.query.value('col3'))))
                    self.table_ep.setItem(tablerow, 3, QtWidgets.QTableWidgetItem((str(self.query.value('col4')))))
                    self.table_ep.setItem(tablerow, 4, QtWidgets.QTableWidgetItem((str(self.query.value('col5')))))
                    self.table_ep.setItem(tablerow, 5, QtWidgets.QTableWidgetItem((str(self.query.value('col6')))))
                    self.table_ep.setItem(tablerow, 6, QtWidgets.QTableWidgetItem((self.query.value('col7'))))
                    self.table_ep.setItem(tablerow, 7, QtWidgets.QTableWidgetItem((str(self.query.value('col8')))))
                    self.table_ep.setItem(tablerow, 8, QtWidgets.QTableWidgetItem((str(self.query.value('col9')))))
                    self.table_ep.setCellWidget(tablerow, 9, checkbox_widget)
     
                    self.table_ep.resizeRowsToContents()
     
                    self.table_ep_cb.stateChanged.connect(self._itemClicked)
     
            except self.query.lastError() as error:
                print("Erreur de chargement de la requête SQL", error)
     
            self.query.finish()
    La fonction (simple pour le moment):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def _itemClicked(self):
            row = self.table_ep.currentRow()
            print(row)
    Vous remerciant à tous d'avance pour votre aide.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    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 813
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Jb_One36 Voir le message
    cependant, pour les besoins de mon utilisation, je n'arrive pas à récupérer le n° de la ligne où est située la QCheckBox qui vient d'être cochée.
    Avant d'identifier le numéro de ligne, arrives-tu déjà à identifier au-moins la QCheckBox cochée???
    Si c'est le cas, alors il te suffit d'ajouter dans le QCheckBox sa ligne courante (tu la connais quand tu la crées). Ca se fait via setProperty("data", ...) (la clef "data" signifie que tu positionnes de la donnée de travail, et les datas sont à mettre ensuite en second paramètre mais comme tu ne peux en mettre qu'une seule, si tu en as plusieurs il te faut alors les agréger sous forme unique, comme liste, tuple, dictionnaire). Et de l'autre côté, quand tu as la checkBox cochée, tu récupères ses datas via property("data").

    Tu peux aussi utiliser le mapper de signal, qui permet de relier plusieurs widgets (donc plusieurs QCheckBox) à un signal tout en rajoutant des informations personnalisées (ie la ligne en cours) au signal reçu par le slot. Un exemple ici.
    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]

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 110
    Par défaut
    Bonjour Sve@r,

    Tout d'abord merci de m'avoir répondu (c'est plutôt rare), voici la réponses à ta question :

    Avant d'identifier le numéro de ligne, arrives-tu déjà à identifier au-moins la QCheckBox cochée???
    Je n'ai pas essayé d'identifier la CheckBox, pour moi ! Etant donné que celle-ci est encapsulée à chaque ajout de ligne dans un QWidget (je l'utilise pour centrer la checkbox dans la cellule), je n'ai pas pensé à vérifier son identité.

    Je te mets ci-dessous une capture d'écran de la colonne en question, c'est plus parlant :

    Nom : Annotation 2022-08-26 142158.jpg
Affichages : 189
Taille : 12,0 Ko

    ------------------------------------------------------------------

    En lisant ton post, j'ai essayé une autre technique avant de consulter le lien que tu m'as noté. Le résultat attendu est correct à ce que je recherche, cependant, j'ai perdu le positionnement de la checkbox dans la cellule (ci-dessous, le code que j'ai changé) :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
            while self.query.next():
                # widget checkbox
                checkbox_widget = QWidget()
                checkbox_widget.setStyleSheet('background-color: transparent;')
     
                layout_cb = QtWidgets.QHBoxLayout(checkbox_widget)
                self.table_ep_cb = QtWidgets.QCheckBox()
                layout_cb.addWidget(self.table_ep_cb)
                layout_cb.setAlignment(Qt.AlignmentFlag.AlignCenter)
                layout_cb.setContentsMargins(0, 0, 0, 0)
                checkbox_widget.setLayout(layout_cb)
     
                tablerow = self.table_ep.rowCount()
     
                self.table_ep.insertRow(tablerow)
     
                self.table_ep.setItem(tablerow, 0, QtWidgets.QTableWidgetItem((self.query.value('poste'))))
                self.table_ep.setItem(tablerow, 1, QtWidgets.QTableWidgetItem((self.query.value('transfo'))))
                self.table_ep.setItem(tablerow, 2, QtWidgets.QTableWidgetItem((self.query.value('libelle'))))
                self.table_ep.setItem(tablerow, 3, QtWidgets.QTableWidgetItem((str(self.query.value('constante')))))
                self.table_ep.setItem(tablerow, 4, QtWidgets.QTableWidgetItem((str(self.query.value('repartition')))))
                self.table_ep.setItem(tablerow, 5, QtWidgets.QTableWidgetItem((str(self.query.value('imputation')))))
                self.table_ep.setItem(tablerow, 6, QtWidgets.QTableWidgetItem((self.query.value('abreviation'))))
                self.table_ep.setItem(tablerow, 7, QtWidgets.QTableWidgetItem((str(self.query.value('coeff')))))
                self.table_ep.setItem(tablerow, 8, QtWidgets.QTableWidgetItem((str(self.query.value('modulo')))))
     
                # AVANT MODIF :
                self.table_ep.setCellWidget(tablerow, 9, checkbox_widget)
     
                # APRES MODIF : J'ajoute l'objet checkbox à la place du widget
                self.table_ep.setCellWidget(tablerow, 9, self.table_ep_cb)
     
                self.table_ep.resizeRowsToContents()
     
                self.table_ep_cb.stateChanged.connect(self._itemClicked)
    La seule modification que j'ai apporté au code ci-dessus a été de remplacer la classe QWidget par l'objet QCheckBox, l'avantage, c'est que maintenant, j'obtiens correctement le n° de ligne mais en revanche, j'ai perdu le positionnement central de la CheckBox (cela est normal mais en corrigeant un problème, j'en ai créé un autre).

    Merci d'avance pour ton retour ainsi que de ton aide.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    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 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jb_One36 Voir le message
    Tout d'abord merci de m'avoir répondu (c'est plutôt rare)
    Ben les gens font ce qu'ils peuvent. Si je sais, je réponds. D'ailleurs en regardant ton historique j'ai vu qu'on avait déjà parlé à propos d'un QPushButton qui devait ouvrir une fenêtre.
    Evidemment si je ne suis pas du domaine (ex ton souci Wireshark posté en 2018) ben...
    Moi aussi j'ai posté parfois sans avoir de retour. Mais dans toutes les technos faciles (C, shell, Python, Qt) c'est généralement assez réactif.

    Citation Envoyé par Jb_One36 Voir le message
    Je te mets ci-dessous une capture d'écran de la colonne en question, c'est plus parlant
    Ce qui est vraiment plus parlant c'est un code minimaliste mais fonctionnel qu'on peut récupérer pour tester

    Exemple
    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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt6.QtCore import *
    from PyQt6.QtGui import *
    from PyQt6.QtWidgets import *
    import sys
     
    # L'objet pour gérer mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le widget
    		self.__widget=myWidget(rows=rows)
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec(self):
    		# Affichage du widget
    		self.__widget.show()
     
    		# Appel méthode objet hérité
    		return super().exec()
    	# exec()
    # class myAppli
     
    # La fenêtre principale de mon application
    class myWidget(QTableWidget):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(rows, 3, *args, **kwargs)
     
    		# Remplissage
    		for i in range(rows):
    			# Première colonne: Un texte
    			self.setCellWidget(i, 0, QLabel("Hello %d" % i, parent=self))
     
    			# Seconde colonne: Une saisie
    			self.setCellWidget(i, 1, QLineEdit(parent=self))
     
    			# Troisième colonne: Une case à cocher
    			b=QCheckBox(parent=self)
    			b.stateChanged[int].connect(self.__slotBox)
    			self.setCellWidget(i, 2, b)
    		# for
    	# __init()
     
            @pyqtSlot(int)
    	def __slotBox(self, v):
    		print("value=%d, pos=%d, %d" % (v, self.currentRow(), self.currentColumn()))
    # class myWidget
     
    # Le programme principal
    if __name__ == "__main__":
    	# L'application principale Qt
    	sys.exit(myAppli(10, sys.argv).exec())
    # if
    Je n'ai eu aucun souci d'identification.

    Ensuite j'ai regardé ton souci d'alignement, que tu résouds par une widget qui vient encapsuler le QCheckBox. Donc évolution
    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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt6.QtCore import *
    from PyQt6.QtGui import *
    from PyQt6.QtWidgets import *
    import sys
     
    # L'objet pour gérer mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le widget
    		self.__widget=myWidget(rows=rows)
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec(self):
    		# Affichage du widget
    		self.__widget.show()
     
    		# Appel méthode objet hérité
    		return super().exec()
    	# exec()
    # class myAppli
     
    # La fenêtre principale de mon application
    class myWidget(QTableWidget):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(rows, 3, *args, **kwargs)
     
    		# Remplissage
    		for i in range(rows):
    			# Première colonne: Un texte
    			self.setCellWidget(i, 0, QLabel("Hello %d" % i, parent=self))
     
    			# Seconde colonne: Une saisie
    			self.setCellWidget(i, 1, QLineEdit(parent=self))
     
    			# Troisième colonne: Une case à cocher
    			b=QCheckBox(parent=self)
    			b.stateChanged[int].connect(self.__slotBox)
    			w=QWidget(parent=self)
    			l=QHBoxLayout(w)
    			l.setContentsMargins(0, 0, 0, 0)
    			l.setSpacing(0)
    			l.setAlignment(Qt.AlignmentFlag.AlignCenter)
    			l.addWidget(b)
    			self.setCellWidget(i, 2, w)
    		# for
    	# __init()
     
            @pyqtSlot(int)
    	def __slotBox(self, v):
    		print("value=%d, pos=%d, %d" % (v, self.currentRow(), self.currentColumn()))
    # class myWidget
     
    # Le programme principal
    if __name__ == "__main__":
    	# L'application principale Qt
    	sys.exit(myAppli(10, sys.argv).exec())
    # if

    Et là je vois le souci et le pourquoi du souci: le QWidget prend le pas sur le QCheckBox. Donc si on veut récupérer la ligne checkée, il faut commencer par cliquer dans la cellule pour l'activer et ensuite cliquer sur le CheckBox. Parce que si on ne fait pas cette première action clic, alors la cellule courante est celle qui a été sélectionnée plus tôt et le CheckBox lui ne change pas cette cellule courante.

    Pour l'instant je vois 3 solutions
    • self.sender(), que tu peux afficher en plus des autres infos dans le __slotBox() de mon second exemple. Ca te montrera (donc identifiera) la QCheckBox qui a été cochée. De là tu peux remonter à sa position.
    • un QSignalMapper, qui centralisera tous les signaux de toutes les QCheckBox et auquel chaque CheckBox peut rajouter une info personnalisée comme j'ai déjà parlé. Si tu veux je peux t'écrire un exemple, c'est moins compliqué qu'il n'y parait.
    • un QItemDelegate. Pour résumer l'idée, la cellule affiche juste une info "cochée/pas cochée" (donc via un simple QTableWidgetItem que tu peux aligner comme tu veux) et c'est quand tu cliques dedans que là elle devient QCheckBox (ou QWidget+QLayout+QCheckBox si tu veux). Mais comme tu as cliqué dedans, ton QTableWidget est bien positionné.
      Plus de détails ici.
    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
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 110
    Par défaut
    Bonjour Sve@r,

    Ben les gens font ce qu'ils peuvent. Si je sais, je réponds. D'ailleurs en regardant ton historique j'ai vu qu'on avait déjà parlé à propos d'un QPushButton qui devait ouvrir une fenêtre.
    Evidemment si je ne suis pas du domaine (ex ton souci Wireshark posté en 2018) ben...
    Moi aussi j'ai posté parfois sans avoir de retour. Mais dans toutes les technos faciles (C, shell, Python, Qt) c'est généralement assez réactif.
    C'est un grand PLAISIR d'avoir à nouveau une réponse à mon problème venant de ta part, un grand MERCI pour ton aide. Ca fait peut-être beaucoup de remerciements mais en soit, je trouve ça normal de le dire à quelqu'un qui apporte son soutien, idée, voir solution car il n'est pas obligé (c'était une petite parenthèse).

    Concernant tes 3 propositions, je vais m'orienter sur le QSignalMapper, je vois qu'il t'est possible de me fournir un exemple, je préfère dans un 1er temps, le faire de mon côté en m'appuyant sur le lien de l'exemple que tu m'as fourni dans ton précédent post.

    En cas de non réussite, je reviendrai vers toi pour avoir de nouveau ton aide sur ce sujet, dans le cas contraire, je posterai le résultat (après tests validés) ici, en apportant (je l'espère) l'aspect "Résolu" concernant mon problème.

    Je m'empresse de faire ça aujourd'hui et je te tiendrai informé.

    Passe une bonne journée.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    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 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jb_One36 Voir le message
    je préfère dans un 1er temps, le faire de mon côté en m'appuyant sur le lien de l'exemple que tu m'as fourni dans ton précédent post.
    Autant accélérer un peu les choses. Surtout que le mappeur n'est pas aussi utile que ce que je pensais (explications après)
    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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt6.QtCore import *
    from PyQt6.QtGui import *
    from PyQt6.QtWidgets import *
    import sys
     
    # L'objet pour gérer mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le widget
    		self.__widget=myWidget(rows=rows)
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec(self):
    		# Affichage du widget
    		self.__widget.show()
     
    		# Appel méthode objet hérité
    		return super().exec()
    	# exec()
    # class myAppli
     
    # La fenêtre principale de mon application
    class myWidget(QTableWidget):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(rows, 3, *args, **kwargs)
     
    		# Le mappeur de signal
    		mapBox=QSignalMapper(parent=self)
     
    		# L'info que le mappeur transmettra sera un objet Qt
    		mapBox.mappedObject.connect(self.__slotBox)
     
    		# Remplissage
    		for i in range(rows):
    			# Première colonne: Un texte
    			self.setCellWidget(i, 0, QLabel("Hello %d" % i, parent=self))
     
    			# Seconde colonne: Une saisie
    			self.setCellWidget(i, 1, QLineEdit(parent=self))
     
    			# Troisième colonne: Une case à cocher
    			b=QCheckBox(parent=self)
    			b.setProperty("data", QVariant((i, 3)))		# Info interne CheckBox
    			b.stateChanged[int].connect(mapBox.map)		# Le clic CheckBox est envoyé au mappeur
    			mapBox.setMapping(b, b)				# Le mappeur associe le CheckBox au signal qu'il renvoie
    			w=QWidget(parent=self)
    			l=QHBoxLayout(w)
    			l.setContentsMargins(0, 0, 0, 0)
    			l.setSpacing(0)
    			l.setAlignment(Qt.AlignmentFlag.AlignCenter)
    			l.addWidget(b)
    			self.setCellWidget(i, 2, w)
    		# for
    		self.resize(400, 380)
    	# __init()
     
    	def __slotBox(self, w):
    		p=w.property("data")
    		print("value=%s, pos=%d, %d" % (w.checkState(), p[0], p[1]))
    	# __slotBox
    # class myWidget
     
    # Le programme principal
    if __name__ == "__main__":
    	# L'application principale Qt
    	sys.exit(myAppli(10, sys.argv).exec())
    # if

    En fait le souci du mappeur c'est que je l'ai présenté comme pouvant envoyer n'importe quelle info or je me suis trompé, il ne peut envoyer que 3 types d'infos: un unique int, une unique string, ou bien un widget Qt (je pensais qu'il pouvait envoyer n'importe quel objet Qt ce qui m'aurait permis d'y mettre un QVariant (un objet dédié à stocker de l'info diverse) mais en fait non, il ne peut emporter qu'un objet de type widget).
    Alors si on veut juste la ligne courante ça le fait via l'int mais s'il faut plusieurs infos, on est limité. Certes on peut sérialiser les infos en un gros flux binaire via le module pickle et ensuite convertir le flux en string via base64 (et de l'autre côté faire l'opération inverse) mais ça devient lourd (faut pas oublier que c'est du temps de calcul tout ça et que l'utilisateur il veut une IHM réactive).
    Donc j'ai fait plus simple: le mappeur de signal embarque avec lui la box. Et dans la box j'y place via setProperty() les infos que je veux récupérer (ligne/colonne/âge du chien/météo du jour/etc/etc/etc)
    Et de l'autre côté, je récupère la box donc ses infos.

    Sauf que comme je l'ai dit, la box on l'avait déjà via self.sender(). De là, le mappeur de signal devient de suite moins utile...
    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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt6.QtCore import *
    from PyQt6.QtGui import *
    from PyQt6.QtWidgets import *
    import sys
     
    # L'objet pour gérer mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le widget
    		self.__widget=myWidget(rows=rows)
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec(self):
    		# Affichage du widget
    		self.__widget.show()
     
    		# Appel méthode objet hérité
    		return super().exec()
    	# exec()
    # class myAppli
     
    # La fenêtre principale de mon application
    class myWidget(QTableWidget):
    	# Constructeur
    	def __init__(self, rows, *args, **kwargs):
    		# Appel méthode objet hérité
    		super().__init__(rows, 3, *args, **kwargs)
     
    		# Remplissage
    		for i in range(rows):
    			# Première colonne: Un texte
    			self.setCellWidget(i, 0, QLabel("Hello %d" % i, parent=self))
     
    			# Seconde colonne: Une saisie
    			self.setCellWidget(i, 1, QLineEdit(parent=self))
     
    			# Troisième colonne: Une case à cocher
    			b=QCheckBox(parent=self)
    			b.setProperty("data", QVariant((i, 3)))		# Info interne CheckBox
    			b.stateChanged[int].connect(self.__slotBox)
    			w=QWidget(parent=self)
    			l=QHBoxLayout(w)
    			l.setContentsMargins(0, 0, 0, 0)
    			l.setSpacing(0)
    			l.setAlignment(Qt.AlignmentFlag.AlignCenter)
    			l.addWidget(b)
    			self.setCellWidget(i, 2, w)
    		# for
    		self.resize(400, 380)
    	# __init()
     
            @pyqtSlot(int)
    	def __slotBox(self, v):
    		p=self.sender().property("data")
    		print("value=%d, pos=%d, %d" % (v, p[0], p[1]))
    	# __slotBox
    # class myWidget
     
    # Le programme principal
    if __name__ == "__main__":
    	# L'application principale Qt
    	sys.exit(myAppli(10, sys.argv).exec())
    # if
    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]

  7. #7
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    Salut,

    @ Sve@r

    Bien vu le setProperty(), je n'aurais pas pensé à l'utiliser.

    J'étais parti sur un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b.setObjectName(str(i))
    Et dans la méthode __slotBox()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def __slotBox(self):
    		obj = self.sender()
    		print("Ligne :", obj.objectName())
    		print("Coché :", obj.isChecked())

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    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 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Diablo76 Voir le message
    Bien vu le setProperty(), je n'aurais pas pensé à l'utiliser.
    Si tu ne le connais pas c'est excusable. Sinon...
    (en plus je l'avais mentionné dans mon premier post )

    Citation Envoyé par Diablo76 Voir le message
    J'étais parti sur un b.setObjectName(str(i))
    Oui, solution alternative. Mais bon, le nom d'un objet n'est pas vraiment destiné à stocker une valeur de travail. Pour ça il y a setProperty()
    Toutefois (et ça je n'ai jamais compris pourquoi), chez certains objets (exemple les QListWidgetItem) la méthode se nomme setData() et la clef identifiant qu'il s'agit d'une data de travail se nomme Qt.UserRole ...
    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]

  9. #9
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 142
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Si tu ne le connais pas c'est excusable. Sinon...
    (en plus je l'avais mentionné dans mon premier post )
    Pas trop forte la s'il te plait, car bien qu'en ayant survolé la méthode setProperty() dans la doc Qt, je ne l'ai jamais appliqué...

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/05/2010, 20h51
  2. Réponses: 3
    Dernier message: 24/04/2008, 21h56
  3. Réponses: 14
    Dernier message: 07/09/2007, 22h45
  4. Réponses: 3
    Dernier message: 05/03/2007, 23h54
  5. [VBA-E]récupérer le nom des lignes sélectionnées d'une listbox
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/06/2006, 11h28

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