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 :

ComboBox dans une QTableWidget


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Par défaut ComboBox dans une QTableWidget
    Bonjour à tous,
    Je débute en python et je cherche depuis plusieurs jours à mettre une liste déroulante dans un tableau de donnée qui est reliè à une seconde table.

    Dans l'exemple ci-dessous, j'ai une table client qui a un id_pays qui fait référence à une table pays.

    Nom : combo1.jpg
Affichages : 706
Taille : 21,5 Ko

    Je souhaite avoir une liste déroulante avec le nom des pays et pouvoir les modifier avec la combobox pour chaque client :

    Nom : combo2.jpg
Affichages : 750
Taille : 35,7 Ko

    ci-dessous mon code exemple :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    import sys
    from PyQt5 import (QtWidgets, QtCore, QtSql)
    from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow, QWidget
    import sqlite3
     
    class ComboBoxExample(QMainWindow):
        def __init__(self):
            super().__init__()
            self.conn = sqlite3.connect("database.db")
            cursor = self.conn.cursor()
     
            QWidget.__init__(self)
            self.setWindowTitle("client")
            self.setMinimumHeight(450)
            self.setMinimumWidth(700)
     
            # Tableau client
            cursor.execute("SELECT client.id, client.name, client.id_pays, pays.nom_pays, pays.nom_pays "
                           "FROM client INNER JOIN pays ON client.id_pays = pays.id")
     
            result = cursor.fetchall()
     
            # Liste des pays pour combobox
            cursor.execute("SELECT * FROM pays")
            self.values = [row[1] for row in cursor.fetchall()]
     
            # affichage Tableau Client
            self.tableau = QtWidgets.QTableWidget(self)
            self.tableau.setGeometry(20, 100, 550, 300)
     
            # définition du tableau Client
            self.tableau.setRowCount(len(result))
            self.tableau.setColumnCount(len(result[0]))
            self.tableau.setHorizontalHeaderLabels(["id client", "client", "id pays", "pays", "pays"])
     
            # Remplissage du tableau Client avec les données de la table
            for i, row in enumerate(result):
                for j, item in enumerate(row):
                    self.combo = QComboBox()
                    self.combo.addItems(self.values)
                    self.tableau.setCellWidget(i, 4, self.combo)
                    self.tableau.setItem(i, j, QtWidgets.QTableWidgetItem(str(item)))
     
     
            # Affichage du tableau dans la fenêtre
            self.tableau.show()
            self.tableau.resizeColumnsToContents()
            self.tableau.setColumnWidth(0, 100)
            self.tableau.setColumnWidth(1, 100)
            self.tableau.setColumnWidth(2, 100)
            self.tableau.setColumnWidth(3, 100)
            self.tableau.setColumnWidth(4, 100)
            self.tableau.resizeRowsToContents()
     
    app = QApplication(sys.argv)
    combo_box_example = ComboBoxExample()
    combo_box_example.show()
    sys.exit(app.exec_())

    Merci par avance pour votre aide
    Stéphane
    Images attachées Images attachées  

  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
    Salut,

    Ça se fait simplement avec setCellWidget(row, cool, widget).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            item = QWidget(attrs)
            self.setCellWidget(r, 2, item)
    tu remplaces QWidget(attrs) par le widget que tu veux insérer dans cette cellule.

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Ça se fait simplement avec setCellWidget(row, cool, widget).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            item = QWidget(attrs)
            self.setCellWidget(r, 2, item)
    tu remplaces QWidget(attrs) par le widget que tu veux insérer dans cette cellule.
    Salut Vins,
    Merci pour ta réponse,
    En fait pour mettre la combobox pas de problème mais le plus compliqué est de lier les valeurs de la combobox a une autre table par un id, de faire afficher la valeur de la premiere table quand on ouvre la fenetre et de modifier les valeur par la combobox.

  4. #4
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Par défaut
    Bonjour à tous,
    J'avance dans mon problème.
    Nom : Capture d’écran 2023-02-04 093154.jpg
Affichages : 626
Taille : 10,8 Ko

    Avec le code ci-dessous cela fonctionne mais que sur la dernière ligne !!
    si je modifie les lignes 1 , 2 ou 3 elles modifient la ligne 4.
    En fait l'idcli a toujours la valeur 4 :

    def on_combo_changed(self, idcli):

    J'ai l'impression qu'il prend la dernière valeur de ma boucle for.
    Je suis pas trés loin de la solution !!

    Merci par avance
    Stéphane

    Mon nouveau 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
    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
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    import sqlite3
     
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.table = QtWidgets.QTableWidget(self)
            self.setCentralWidget(self.table)
     
            self.db = sqlite3.connect("database.db")
            self.cursor = self.db.cursor()
     
            self.cursor.execute("SELECT * FROM client")
            clients = self.cursor.fetchall()
            self.table.setRowCount(len(clients))
            self.table.setColumnCount(2)
     
            self.cursor.execute("SELECT * FROM pays")
            pays = self.cursor.fetchall()
            self.pays = {pay[0]: pay[1] for pay in pays}
            print("pays=", pays)
     
            for row, client in enumerate(clients):
                idcli, nom, pays_id = client
                print(client)
                combo = QtWidgets.QComboBox()
                combo.addItems(self.pays.values())
                combo.setCurrentText(self.pays[pays_id])
                combo.currentIndexChanged.connect(lambda: self.on_combo_changed(idcli))
                self.table.setCellWidget(row, 0, QtWidgets.QLabel(nom))
                self.table.setCellWidget(row, 1, combo)
     
        def on_combo_changed(self, idcli):
            print("idcli =", idcli)
            combo = self.sender()
            pays_nom = combo.currentText()
            print("pays_nom =", pays_nom)
            pays_id = list(self.pays.keys())[list(self.pays.values()).index(pays_nom)]
            print("pays_id =", pays_id)
     
            self.cursor.execute("UPDATE client SET pays_id=? WHERE id=?", (pays_id, idcli))
            self.db.commit()
     
    if __name__ == "__main__":
        import sys
     
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())

  5. #5
    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
    Et si tu essayes comme ceci: combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x)) ?

    Personnellement j'aurais sous-classé la combobox.

  6. #6
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Et si tu essayes comme ceci: combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x)) ?

    Personnellement j'aurais sous-classé la combobox.
    en mettant combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x))il récupere l'index de la liste de la combo et pas l'index de la ligne de la table

Discussions similaires

  1. Variable après un ComboBox dans une boucle FOR
    Par Dream Master dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/05/2007, 09h26
  2. Compiler informations de deux combobox dans une textbox
    Par thiephaine59000 dans le forum Général VBA
    Réponses: 1
    Dernier message: 14/05/2007, 17h58
  3. Combobox dans une Toolbar
    Par dug dans le forum wxWidgets
    Réponses: 2
    Dernier message: 27/03/2007, 15h15
  4. il est possible d avoir un combobox dans une MSFlexgrid ?
    Par leo13 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 09/01/2007, 22h03
  5. [DEBUTANT] Insérer une combobox dans une jTable
    Par Geolem dans le forum Composants
    Réponses: 2
    Dernier message: 25/11/2006, 17h02

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