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
| #!/usr/bin/python
# -*- coding: utf-8 -*-
# Python 3
import sys
from PyQt5 import QtWidgets, QtCore, QtSql
#############################################################################
def ouvrebaseqt(basesql, contrainte=True):
"""ouvre la base 'basesql' de sqlite3 et renvoie la connexion ouverte
(ou None si échec)
"""
# tente d'ouvrir la base
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(basesql)
if not db.open():
db = None
# active les contraites d'intégrité référentielles
if (db != None) and contrainte:
query = QtSql.QSqlQuery(db)
req = "PRAGMA foreign_keys=on;"
if not query.exec_(req):
query.finish() # désactive le curseur
query = None
fermebaseqt(db) # ferme la base
db = None
if query != None:
query.finish() # désactive le curseur
# renvoie la connexion ouverte (ou None si échec)
return db
#############################################################################
def fermebaseqt(db):
"""ferme la base de données db
"""
if db!=None:
db.close()
#############################################################################
class VoirTableSql(QtWidgets.QMainWindow):
def __init__(self, basesql, nomtable, parent=None):
super(VoirTableSql, self).__init__(parent)
self.setWindowTitle("Affichage de la table %s" % (nomtable,))
self.resize(800, 600)
# stocke les arguments passés
self.basesql = basesql
self.nomtable = nomtable
# ouvre la base SQL
self.db = ouvrebaseqt(self.basesql)
if self.db == None:
self.close() # impossible d'ouvrir la base: arrêt du programme
# crée le modèle et sa liaison avec la base SQL
self.model = QtSql.QSqlRelationalTableModel(self, self.db)
# stratégie en cas de modification de données par l'utilisateur
self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
# crée la table et son lien avec le modèle
self.vuetable = QtWidgets.QTableView(self)
self.vuetable.setModel(self.model)
self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(self.vuetable))
# active le tri en cliquant sur les têtes de colonnes
self.vuetable.setSortingEnabled(True)
# positionne le QTableView dans la fenêtre
self.setCentralWidget(QtWidgets.QFrame())
posit = QtWidgets.QGridLayout()
posit.addWidget(self.vuetable, 0, 0)
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
# trie si nécessaire selon la colonne 0
self.model.sort(0, QtCore.Qt.AscendingOrder) # ou DescendingOrder
# ajuste la largeur des colonnes en fonction de leurs contenus
self.vuetable.resizeColumnsToContents()
#========================================================================
def closeEvent(self, event=None):
"""Méthode appelée automatiquement à la fermeture de la fenêtre
"""
# ferme la base
fermebaseqt(self.db)
# et accepte la fermeture de la fenêtre
event.accept()
#############################################################################
if __name__ == "__main__":
# lance la bibliothèque Qt
app = QtWidgets.QApplication(sys.argv)
# définit les paramètres: base de données et table à afficher
basesql = "mabase.db3"
nomtable = "matable"
# lance la fenêtre
fen = VoirTableSql(basesql, nomtable)
fen.show()
# lance la boucle de traitement des évènements
sys.exit(app.exec_()) |
Partager