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
| import sys
import sqlite3
import random
from PyQt4 import QtCore, QtGui, QtSql
#############################################################################
def creat():
""" creation au hazard d'une chaine de caractere (taille de la chaine =8) """
text=''
for i in range(8):
text+=chr(random.randint(65,123))
return text
def creabasesql(basesql):
"""créer une base sql composée de 100 chaines de caracteres tirées au hasard"""
cnx = sqlite3.connect(basesql)
cur = cnx.cursor()
cur.execute("""drop table if exists 'matable' """)
cur.execute("""create table 'matable' (num integer)""")
try:
for i in range(1, 101):
cur.execute("""insert into 'matable' values(?)""",
(creat(),))
cnx.commit()
except sqlite3.Error:
cnx.rollback()
print ("erreur: " , (unicode(err.args[0]),))
cur.close()
cnx.close()
#############################################################################
class MonModel(QtSql.QSqlRelationalTableModel):
"""permet au modèle de charger la table complète des données"""
def select(self):
results = QtSql.QSqlRelationalTableModel.select(self)
while self.canFetchMore():
self.fetchMore()
return results
#############################################################################
class Vuetable(QtGui.QWidget):
"""fenêtre affichant une table d'une base de données SQL (sqlite3 ici)"""
def __init__(self, basesql, table, parent=None):
super(Vuetable, self).__init__(parent)
# stocker les arguments
self.basesql = basesql
self.table = table
# instructions pour la fenêtre
self.resize(800, 600)
self.setWindowTitle("table: %s de la base: %s" % (self.table,
self.basesql))
# ouvrir une connexion avec la base de données
self.cnx = QtSql.QSqlDatabase.addDatabase("QSQLITE")
self.cnx.setDatabaseName(self.basesql)
if not self.cnx.open():
QtGui.QMessageBox.critical(self,
"Ouverture de la base de données",
"Erreur d'ouverture: %s" % self.cnx.lastError().text())
self.cnx = None
self.close() # fermeture de vuetable
# créer et configurer le modèle
self.model = MonModel(self, self.cnx) # voir classe "MonModel" + haut
self.model.setTable(self.table)
self.model.setEditStrategy(QtSql.QSqlRelationalTableModel.\
OnManualSubmit)
self.model.select() # méthode surchargée de la classe "MonModel"
# créer le QTableView d'affichage
self.vue = QtGui.QTableView(self)
# créer le lien entre la base sql et le QTableView grâce au modèle
self.vue.setModel(self.model)
self.vue.setItemDelegate(QtSql.QSqlRelationalDelegate(self.vue))
# tri ascendant du tableau affiché selon la 1ère colonne
self.vue.setSortingEnabled(True)
self.vue.sortByColumn(0, QtCore.Qt.AscendingOrder)
# régler la largeur des colonnes en fonction de leur contenu
self.vue.resizeColumnsToContents()
# faire que le QTableView prenne toute la fenêtre et suive la redim.
posit = QtGui.QGridLayout()
posit.addWidget(self.vue, 0, 0)
self.setLayout(posit)
#############################################################################
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
basesql = "mabase.db3"
creabasesql(basesql)
fen = Vuetable(basesql, "matable")
fen.show()
sys.exit(app.exec_()) |
Partager