Bonjour,
J'ai cherché un peu partout mais je ne trouve pas.
j'ai une base d'essai que je voudrais afficher dans un TableVeiw mais je n'arrive pas à créer la liaison de la base avec le QsqlRelationalTableModel
j'ai le message d'erreur :
error QSqlRelationalTableModel(parent.....): argument 2 has unexpected 'CMySQLConnexion'
j'ai essayé avec la fonction MySQLConnexion de mysql.connector mais j'obtiens le même message avec
MySQLConnexion au lieu de CMySQLConnexion.
avec une connexion a une base SQLite ça fonctionne.
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 10 18:01:19 2019
etude_bdd_treview2.py
@author: gpoid
"""
 
import sys
from PyQt5 import (QtWidgets, QtCore, QtSql)
import mysql.connector
from mysql.connector import errorcode
 
DB_NAME = 'etude'
table = "matable"
 
#####################################################################
def ouvrebase(basesql):
    """ouvre la base et renvoie la connexion
       si contrainte est True, active les contraintes de clé étrangère
       en cas d'échec, retourne None"""
 
    try:
       cnx = mysql.connector.connect(host = '127.0.0.1',
                            database = DB_NAME,
                            user = 'guy',
                            password = ' ')
       if cnx.is_connected():
            print('Connecté MySql à la base')
            return cnx
 
    except mysql.connector.Error as err :
       if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
           print("erreur nom utilisateur ,ou password")
       elif err.errno == errorcode.ER_BAD_DB_ERROR:
            print("la base n existe pas")
       sys.exit()
 
 
 
 
#######################################################################
 
class VoirTableSql(QtWidgets.QMainWindow):
    def __init__(self, basesql, nomtable, parent=None):
        super().__init__(parent)
        self.setWindowTitle("Affichage de la table %s" % (nomtable,))
        self.resize(800, 600)
        # ouvre la baseb SQL
        self.basesql=DB_NAME
        self.cnx=ouvrebase(basesql)
 
 
        # table à afficher
        self.nomtable = nomtable
        # crée le modèle et sa liaison avec la base SQL ouverte
        self.model = QtSql.QSqlRelationalTableModel(self,self.cnx )
        # stratégie en cas de modification de données par l'utilisateur
        self.model.setEditStrategy(QtSql.QSqlRelationalTableModel
                                   .OnManualSubmit)
        # crée la table graphique et son lien avec le modèle
        self.vuetable = QtWidgets.QTableView(self)
        self.vuetable.setModel(self.model)
        # active le tri en cliquant sur les têtes de colonnes
        #self.vuetable.setSortingEnabled(True)
        # crée un bouton pour enregistrer les modifications dans la base
        self.bouton1 = QtWidgets.QPushButton(
                "Enregistrer les modifications", self)
        self.bouton1.clicked.connect(self.appliquer)
        # crée un bouton pour annuler les modifications non enregistrées
        self.bouton2 = QtWidgets.QPushButton("Annuler les modifications",
                                             self)
        self.bouton2.clicked.connect(self.annuler)
        # positionne les widgets dans la fenêtre QMainWindow
        self.setCentralWidget(QtWidgets.QFrame())
        posit = QtWidgets.QGridLayout()
        posit.addWidget(self.bouton1, 0, 0)
        posit.addWidget(self.bouton2, 0, 1)
        posit.addWidget(self.vuetable, 1, 0, 1, 2)
        self.centralWidget().setLayout(posit)
        # affiche la table demandée
        self.model.setTable(self.nomtable)
        self.model.select() # peuple le modèle avec les données de la table
        # met un delegate standard pour l'édition
        self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(
                self.vuetable))
        # trie si nécessaire selon la colonne 0
        self.model.sort(0, QtCore.Qt.AscendingOrder) # ou DescendingOrder
        # ajuste hauteur lignes et largeur colonnes selon contenus
        self.vuetable.resizeColumnsToContents()
        self.vuetable.resizeRowsToContents()
 
    #===================================================================
    def appliquer(self):
        """Enregistre les modifications des données
* * * * """
        if self.model.submitAll():
            # ajuste hauteur lignes et largeur colonnes selon contenus
            self.vuetable.resizeColumnsToContents()
            self.vuetable.resizeRowsToContents()
            # message ok
            QtWidgets.QMessageBox.information(self,
                "Enregistrement des modifications",
                "Enregistrement terminé")
        else:
            # message erreur
            QtWidgets.QMessageBox.warning(self,
                "Enregistrement des modifications",
                "Erreur: %s" % self.model.lastError().text())
    #===================================================================
    def annuler(self):
        """Annule les modifications des données faites avant enregistrement """
        self.model.revertAll()
    #===================================================================
    def closeEvent(self, event=None):
        """Méthode appelée automatiquement à la fermeture de la fenêtre
* * * * """
        # ferme la base 
        event.accept()
 
########################################################################
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    fen = VoirTableSql(DB_NAME, table)
    fen.show()
    sys.exit(app.exec_())
De l'aide serait la bienvenue.