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
| #!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
# Python 2.7
import sys, os
from PyQt4 import QtCore, QtGui, QtSql
#############################################################################
def litbaseqt(query):
"""retourne la liste des enregistrements lus dans la base ouverte pour qt
toutes les valeurs sont retournées sous forme de chaine de caractères
"""
R = []
while query.next():
R.append([])
j = 0
while query.value(j).isValid():
R[-1].append(unicode(query.value(j).toString()))
j += 1
return R
#############################################################################
class Vuetable(QtGui.QWidget):
#========================================================================
def __init__(self, cnx, table, parent=None):
super(Vuetable, self).__init__(parent)
# connexion à la base de données
self.cnx = cnx
# nom de la table à afficher
self.table = table
# création de la grille d'affichage
self.vuetable = QtGui.QTableView(self)
self.vuetable.setSortingEnabled(True)
# Création du modèle de relation entre la base et la grille d'affichage
self.modele = QtSql.QSqlRelationalTableModel(self, self.cnx)
self.modele.setTable(self.table)
self.modele.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
self.modele.select()
# Etablissement de la relation entre la base et la grille d'affichage
self.vuetable.setModel(self.modele)
self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(self.vuetable))
# création du label
self.label = QtGui.QLabel(self)
# positionnement des widgets dans la fenêtre
posit = QtGui.QGridLayout()
posit.addWidget(self.vuetable, 0, 0)
posit.addWidget(self.label, 1, 0)
self.setLayout(posit)
# calcul et affichage de la somme de la colonne col2
query = QtSql.QSqlQuery(self.cnx)
req = """
select sum(col2)
from matable
"""
if query.exec_(req):
result = unicode(litbaseqt(query)[0][0])
self.label.setText(result)
else:
QtGui.QMessageBox.critical(self,
u"Attention",
u"Erreur d'extraction : %s" % (unicode(query.lastError().text()),)
)
query.finish() # désactiver le curseur
#========================================================================
def closeEvent(self, event):
"""méthode exécutée à chaque demande de fermeture de la fenêtre"""
# fermeture de la base
self.cnx.close()
# acceptation de la fermeture de la fenêtre
event.accept()
#############################################################################
if __name__ == "__main__":
# initialisation du graphique
app = QtGui.QApplication(sys.argv)
# ouverture de la base de données
cnx = QtSql.QSqlDatabase.addDatabase("QSQLITE")
basesql = u"mabase.db"
cnx.setDatabaseName(basesql)
if not cnx.open():
QtGui.QMessageBox.critical(None,
u"Ouverture de la base de données",
u"Erreur d'ouverture de la base de données")
sys.exit(app.quit())
# spécifique à sqlite: activer les contraites de clé étrangère
query = QtSql.QSqlQuery(cnx)
query.exec_("PRAGMA foreign_keys=on")
query.finish() # désactiver le curseur
# définition de la table à afficher
table = u"matable" # nom de la table à afficher
# affichage de la fenêtre
fen = Vuetable(cnx, table)
fen.show()
sys.exit(app.exec_()) |
Partager