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 :

Créer un lien entre un QTableView et LineEdit à l'aide de QDataWidgetMappar [QtSql]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Par défaut Créer un lien entre un QTableView et LineEdit à l'aide de QDataWidgetMappar
    Bonjour,

    Je viens juste de commencer avec PyQt5 et je voudrais utilisé QDataWidgetMapper pour afficher les champs d'une table dans des lineEdit. J'ai beau cherché sur le net mais, j'ai pas trouver d'exemple claire.
    Je vous saurais très reconnaissant si quelqu'un pourrai m'aider avec un bon exemple.
    Merci.

  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,

    Je n'ai jamais utilisé ce QDataWidgetMapper avec une base de données, mais voilà un petit exemple tout simple basé sur un QStandardItemModel qui devrait te donner des idées d'utilisation. En exécutant ce code, tu verras que les 3 colonnes (Nom, Adresse, Age) restent bien synchronisées quand on passe d'un enregistrement à l'autre avec les 2 boutons "Suivant" et "Précédent":

    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
    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import QtWidgets, QtGui
     
    #############################################################################
    class Window(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setWindowTitle("Exemple de QDataWidgetMapper")
     
            # crée le modèle
            self.setupModel()
     
            # pour afficher le nom
            self.nameLabel = QtWidgets.QLabel("Nom:")
            self.nameEdit = QtWidgets.QLineEdit()
     
            # # pour afficher l'adresse
            self.addressLabel = QtWidgets.QLabel("Adresse:")
            self.addressEdit = QtWidgets.QTextEdit()
            self.addressEdit.setAcceptRichText(False)
     
            # # pour afficher l'age
            self.ageLabel = QtWidgets.QLabel("Age:")
            self.ageSpinBox = QtWidgets.QSpinBox()
     
            # Pour naviguer entre les enregistraments
            self.nextButton = QtWidgets.QPushButton("Suivant")
            self.previousButton = QtWidgets.QPushButton("Précédent")
     
            # Widget de correspondance entre les colonnes des enregistrements
            self.mapper = QtWidgets.QDataWidgetMapper(self)
            self.mapper.setModel(self.model)
            self.mapper.addMapping(self.nameEdit, 0)
            self.mapper.addMapping(self.addressEdit, 1)
            self.mapper.addMapping(self.ageSpinBox, 2)
     
            # Connexions
            self.previousButton.clicked.connect(self.mapper.toPrevious)
            self.nextButton.clicked.connect(self.mapper.toNext)
            self.mapper.currentIndexChanged.connect(self.updateButtons)
     
            # Nécessaire au premier lancement
            self.mapper.toFirst() 
            self.updateButtons(0)
     
            # positionne les widgets dans la fenêtre
            posit = QtWidgets.QGridLayout()
            # 1ère ligne
            posit.addWidget(self.nameLabel, 0, 0, 1, 1)
            posit.addWidget(self.nameEdit, 0, 1, 1, 2)
            posit.addWidget(self.nextButton, 0, 3, 1, 1)
            # 2e ligne
            posit.addWidget(self.addressLabel, 1, 0, 1, 1)
            posit.addWidget(self.addressEdit, 1, 1, 2, 2)
            posit.addWidget(self.previousButton, 1, 3, 1, 1)
            # 3e ligne
            posit.addWidget(self.ageLabel, 3, 0, 1, 1)
            posit.addWidget(self.ageSpinBox, 3, 1, 1, 2)
            # mise en place
            self.setLayout(posit)
     
        #========================================================================
        def setupModel(self):
            """Crée le modèle
            """
            self.model = QtGui.QStandardItemModel(5, 3, self)
     
            names = ["Alice", "Bob", "Carol", "Donald", "Emma"]
            adresses = ["Adresse Alice", "Adresse Bob", "Adresse Carol", "Adresse Donald", "Adresse Emma"]
            ages = ["12", "25", "29", "32", "41"]
     
            for row in range(0, len(names)):
     
                item = QtGui.QStandardItem(names[row])
                self.model.setItem(row, 0, item)
     
                item = QtGui.QStandardItem(adresses[row])
                self.model.setItem(row, 1, item)
     
                item = QtGui.QStandardItem(ages[row])
                self.model.setItem(row, 2, item)
     
        #========================================================================
        def updateButtons(self, index):
            """Met à jour l'état des boutons si nécessaire
            """
            self.previousButton.setEnabled(index>0)
            self.nextButton.setEnabled(index<self.model.rowCount()-1)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Window()
        fen.show()
        sys.exit(app.exec_())

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Par défaut
    Bonjour,

    Après plusieurs essais j'ai pu crée le lien entre TableView et des LineEdit selon le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     # model employes
            modellisteemloyes = QSqlTableModel(self)
            modellisteemloyes.setTable('Agents')
            modellisteemloyes.setEditStrategy(QSqlTableModel.OnManualSubmit)
            modellisteemloyes.select()
            modellisteemloyes.setSort(0, Qt.AscendingOrder)
            self.ui.tableViewEmployes.setModel(modellisteemloyes)
            self.ui.tableViewEmployes.resizeColumnsToContents()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    # Mapp
     
            mapperagent = QDataWidgetMapper(self)
            mapperagent.setSubmitPolicy(QDataWidgetMapper.ManualSubmit)
            mapperagent.setModel(modellisteemloyes)
            mapperagent.setItemDelegate(QSqlRelationalDelegate(self))
            mapperagent.addMapping(self.ui.lematricule, 0)
            mapperagent.addMapping(self.ui.lenom, 1)
            mapperagent.addMapping(self.ui.leprenoms, 2)
            mapperagent.addMapping(self.ui.lefonction, 3)
            mapperagent.addMapping(self.ui.lestructure, 4)
            mapperagent.toFirst()
    Seulement, il s'affiche que le premier enregistrement, je sais qu'il faut créer un index mais, comment. Je demande votre AIDE.
    Merci

  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,

    J'ai modifié mon code précédent pour l'appliquer à la lecture d'une base de données.

    Le principe est simple:
    - ouverture de la base
    - création du modèle QSqlRelationalTableModel qui s'appuiera sur la base ouverte et sa table
    - création des widgets d'affichage
    - création du QDataWidgetMapper qui va établir le lien entre le modèle et les widgets d'affichage

    Il ne reste plus qu'à créer les boutons qui permettront de passer à l'enregistrement suivant ou précédent.

    La base de données (ici sqlite3) appelée "matable.db3" ne contient qu'une table "matable" avec les 5 enregistrements des 3 champs "names", "adresses" et "ages". Les données sont les mêmes que pour le code précédent.


    Voilà le 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
    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import QtWidgets, QtGui, QtCore, QtSql
     
    #############################################################################
    class Window(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setWindowTitle("Exemple de QDataWidgetMapper")
     
            # Ouvre la base sqlite3
            self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
            self.db.setDatabaseName("mabase.db3")
            if not self.db.open():
                QtWidgets.QMessageBox.critical(self, 
                        "Ouverture de la base",
                        "Erreur d'ouverture"
                        )
                raise ValueError ("Erreur d'ouverture de la base de données")
     
            # crée le modèle
            self.model = QtSql.QSqlRelationalTableModel(self, self.db)
            self.model.setTable("matable")
            self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
            self.model.select()
     
            # widget pour afficher le nom
            self.nameLabel = QtWidgets.QLabel("Nom:")
            self.nameEdit = QtWidgets.QLineEdit()
     
            # widget pour afficher l'adresse
            self.addressLabel = QtWidgets.QLabel("Adresse:")
            self.addressEdit = QtWidgets.QTextEdit()
            self.addressEdit.setAcceptRichText(False)
     
            # widget pour afficher l'age
            self.ageLabel = QtWidgets.QLabel("Age:")
            self.ageSpinBox = QtWidgets.QSpinBox()
     
            # Pour naviguer entre les enregistraments
            self.nextButton = QtWidgets.QPushButton("Suivant")
            self.previousButton = QtWidgets.QPushButton("Précédent")
     
            # Widget de correspondance entre le modèle et les widgets d'affichage
            self.mapper = QtWidgets.QDataWidgetMapper(self)
            self.mapper.setModel(self.model)
            self.mapper.addMapping(self.nameEdit, 0)
            self.mapper.addMapping(self.addressEdit, 1)
            self.mapper.addMapping(self.ageSpinBox, 2)
     
            # Définit les connexions
            self.previousButton.clicked.connect(self.mapper.toPrevious)
            self.nextButton.clicked.connect(self.mapper.toNext)
            self.mapper.currentIndexChanged.connect(self.updateButtons)
     
            # Nécessaire au premier lancement
            self.mapper.toFirst() 
            self.updateButtons(0)
     
            # positionne les widgets dans la fenêtre QWidget
            posit = QtWidgets.QGridLayout()
            # 1ère ligne
            posit.addWidget(self.nameLabel, 0, 0, 1, 1)
            posit.addWidget(self.nameEdit, 0, 1, 1, 2)
            posit.addWidget(self.nextButton, 0, 3, 1, 1)
            # 2e ligne
            posit.addWidget(self.addressLabel, 1, 0, 1, 1)
            posit.addWidget(self.addressEdit, 1, 1, 2, 2)
            posit.addWidget(self.previousButton, 1, 3, 1, 1)
            # 3e ligne
            posit.addWidget(self.ageLabel, 3, 0, 1, 1)
            posit.addWidget(self.ageSpinBox, 3, 1, 1, 2)
            # met en place
            self.setLayout(posit)
     
        #========================================================================
        def updateButtons(self, index):
            """Active ou désactive les boutons selon l'index
            """
            self.previousButton.setEnabled(index>0)
            self.nextButton.setEnabled(index<self.model.rowCount()-1)
     
        #========================================================================
        def closeEvent(self, event):
            """Méthode exécutée lors de la fermeture de la fenêtre
               ferme la base si nécessaire
            """
            try:
                self.db.close()
            except Exception:
                pass    
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Window()
        fen.show()
        sys.exit(app.exec_())
    [Edit]: tant qu'à faire, j'ajoute la petite base que j'ai créée à cette occasion, ce qui permettra au code ci-dessus de s'exécuter sans modif. Il faudra la dézipper et la placer dans le même répertoire que le code:
    Fichiers attachés Fichiers attachés

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Par défaut
    Merci tyrtamos pour ta réponse.
    Y a t'il pas une autre façon d'afficher les données dans les widgets en cliquant simplement sur l'enregistrement de la table sans passé par les boutons suivant et précédant ??
    Merci encore.

  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
    Je ne l'ai jamais fait, mais j'imagine qu'en ayant l'index d'un enregistrement de la base de données, on doit pouvoir l'afficher directement en utilisant la méthode setCurrentIndex(int) du QDataWidgetMapper, ou sa méthode setCurrentModelIndex(QModelIndex). Essaie les 2 pour voir celle qui marche.

    La doc du QDataWidgetMapper est là: http://doc.qt.io/qt-5/qdatawidgetmapper.html

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 30/05/2011, 16h13
  2. Réponses: 2
    Dernier message: 17/11/2009, 15h58
  3. Comment créer un lien entre NVU & Oscommerce
    Par la ch'tite dans le forum Internet
    Réponses: 0
    Dernier message: 09/08/2007, 16h03
  4. Réponses: 7
    Dernier message: 19/05/2006, 15h39
  5. [SQL-Server] Créer un lien entre un serveur sql et un forum php...
    Par johnless dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/01/2006, 22h02

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