La FAQ PyQt & PySide
La FAQ PyQt & PySideConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 38, dernière mise à jour : 29 août 2021
Qt offre la possibilité de créer et gérer des bases de données très simplement grâce au module QtSql et notamment les classes QtSql.QSqlDatabase, QtSql.QSqlTableModel et QtSql.QSqlQuery.
La création d'une base de données avec QtSql diffère peu des méthodes traditionnelles (notamment si vous étiez habitué à SQLite3). À noter aussi que QtSql nécessite qu'une instance QtCoreApplication soit créée pour être utilisé. Dans le cas suivant nous créons tout simplement une fenêtre Qt qui créera une instance de la base de données pour y effectuer une requête simple.
QtSql offre la possibilité de travailler avec plusieurs types de bases de données qui sont définis par le pilote appelé. Le gros avantage réside dans le fait que, peu importe le type de base de données choisi, un grand nombre de fonctions sont communes. Donc, si vous savez travailler avec l'un d'eux, vous saurez travailler avec les autres.
# -*- coding: iso-8859-1 -*-
import
sys, os.path
from
PySide import
QtCore, QtGui, QtSql
h =
300
l =
400
class
Frame
(
QtGui.QMainWindow):
def
__init__
(
self, parent=
None
):
## Création de la fenêtre.
QtGui.QMainWindow.__init__
(
self, parent)
self.resize
(
l,h)
self.setFont
(
QtGui.QFont
(
"Verdana"
))
self.setWindowTitle
(
"Bases de données"
)
#Création de la basse de données
self.db =
QtSql.QSqlDatabase.addDatabase
(
"QSQLITE"
) ## Nous indiquons ici le driver avec lequel nous souhaitons travailler.
## Les driver permettent de définir avec quel type de bases de données nous allons travailler.
## Notez qu'il en existe un grand nombre et qu'il vous est même possible d'en personnaliser. Mais ceci sort du contexte actuel.
self.db.setDatabaseName
(
'myBdd'
) ## Nous nommons ici notre base de données.
self.db.open(
) ## Commande permettant d'accéder à la base de données
query =
QtSql.QSqlQuery
(
)
query.exec_
(
'''create table Contact (id INTEGER PRIMARY KEY,nom TEXT, prenom TEXT)'''
)
## Création de la table Contact dans notre base de données ouverte.
self.db.commit
(
) ## Enregistrement de la base de données
self.db.close
(
) ## Fermeture de celle-ci
app =
QtGui.QApplication
(
sys.argv)
frame =
Frame
(
)
frame.show
(
)
sys.exit
(
app.exec_
(
))
Pour ajouter une entrée dans une table avec QtSql, il suffit, une fois celle-ci créée et après connexion, d'ajouter une ligne à notre table et de passer, via la fonction setData(index, value), la valeur value dans la colonne index, la première colonne ayant l'index 0.
# -*- coding: iso-8859-1 -*-
import
sys, os.path
from
PySide import
QtCore, QtGui, QtSql
h =
300
l =
400
mybdd =
'myBdd'
class
Frame
(
QtGui.QMainWindow):
def
__init__
(
self, parent=
None
):
## Création de la fenêtre.
QtGui.QMainWindow.__init__
(
self, parent)
self.resize
(
l,h)
self.setFont
(
QtGui.QFont
(
"Verdana"
))
self.setWindowTitle
(
"Bases de données"
)
txt =
QtGui.QLabel
(
"Nom"
, self)
txt.move
(
10
, 10
)
self.txt1 =
QtGui.QLineEdit
(
""
,self)
self.txt1.move
(
100
,10
)
txt1 =
QtGui.QLabel
(
u"Prénom"
, self)
txt1.move
(
10
, 50
)
self.txt2 =
QtGui.QLineEdit
(
""
,self)
self.txt2.move
(
100
,50
)
self.btn =
QtGui.QPushButton
(
"Enregistrer"
, self)
self.btn.move
(
10
, 100
)
self.btn.clicked.connect
(
self.action)
def
action
(
self):
liste =
[self.txt1.text
(
), self.txt2.text
(
)]
# Écriture dans dans la basse de données
## Les six lignes ci-dessous permettent de se connecter à la base de données et de sélectionner la table dans laquelle on souhaite travailler
self.db =
QtSql.QSqlDatabase.addDatabase
(
"QSQLITE"
)
self.db.setDatabaseName
(
mybdd)
self.db.open(
)
self.model =
QtSql.QSqlTableModel
(
)
self.model.setTable
(
"Contact"
)
self.model.select
(
)
## On insère une ligne supplémentaire qui sera remplie par la suite. Si cette ligne de code est oubliée, c'est une modification qui sera effectuée.
self.model.insertRows
(
0
, 1
)
a =
0
## Nous créons une boucle permettant de rentrer les valeurs des QLineEdit dans notre base de données
while
a <=
1
:
## setData() requiert en premier argument l'index de la ligne à créer, en deuxième la valeur.
## Ici dans le premier argument a+1 correspond à la deuxième colonne de notre table si a = 0. On laisse la première colonne se remplir seule (clé automatique).
## Le premier argument de self.model.index peut prendre n'importe quelle valeur. Ceci ne change rien.
self.model.setData
(
self.model.index
(
0
, a+
1
), liste[a])
a+=
1
self.model.submitAll
(
) ## cette commande permet de sauvegarder les modifications effectuées dans la table.
self.db.close
(
) ## On ferme la base de données.
app =
QtGui.QApplication
(
sys.argv)
frame =
Frame
(
)
frame.show
(
)
sys.exit
(
app.exec_
(
))
Afin de supprimer une ligne d'une base de données, il suffit d'utiliser la méthode removeRow(row) sur l'objet QSqlTableModel() créé lors de la requête.
Dans le code ci-dessous, nous avons choisi avant tout de filtrer les lignes possédant certaines valeurs, puis de supprimer la première ligne.
self.db =
QtSql.QSqlDatabase.addDatabase
(
"QSQLITE"
)
self.db.setDatabaseName
(
"mybdd"
)
self.db.open(
)
self.model =
QtSql.QSqlTableModel
(
)
self.model.setTable
(
"Contact"
)
self.model.setFilter
(
"""nom = '
%s
' and prenom = '
%s
'"""
%(
nom1,prenom1))
self.model.select
(
)
self.model.removeRow
(
0
)
self.db.close
(
)
Par facilité, nous avons choisi de travailler avec SQLite ; cependant, par nature, QtSql supporte une pléthore d'autres SGBD.
QSQL permettant de travailler avec plusieurs DBMS (database management system ; en français, SGBD, système de gestion de base de données), nous supposons ici qu'une connexion à une base de données a préalablement été faite, self.db représentant cette base de données.
Une fois l'objet QSqlTableModel() créé, la méthode record() permet d'isoler et de travailler sur la ligne ou les lignes voulues de la base données. Afin de lire les entrées correspondant à cette sélection, il suffit d'utiliser la méthode value(id_colonne) ou value(nom_colonne), qui renvoient la valeur contenue dans la colonne choisie. On préfèrera la deuxième solution qui nous assurera que les bonnes valeurs sont envoyées au bon endroit et dans tous les cas de figure.
liste =
[]
# ...
self.db.open(
)
self.model =
QtSql.QSqlTableModel
(
)
self.model.setTable
(
"Contact"
)
self.model.select
(
)
nb_row =
self.model.rowCount
(
)
a =
0
while
a <
nb_row:
record =
self.model.record
(
a)
contact =
[record.value
(
"colonne1"
), record.value
(
"colonne2"
)]
liste.append
(
contact)
a +=
1
self.db.close
(
)
return
liste
Ce petit bout de code permettra de créer une liste des valeurs contenues dans les colonnes portant les noms colonne1 et colonne2 de chaque ligne de la table Contact dans notre base de données défini par self.db.
Le module QtSql permet de remplir un tableau très rapidement depuis une base de données. Pour cela, nous il faut tout d'abord se connecter à la base comme vu plus haut, puis utiliser l'objet QtSql.QSqlTableModel() et sa fonction setHeaderData(section, orientation, value) :
- section : représente le numéro de la colonne de la base de données ;
- orientation : l'orientation à suivre lors du remplissage du tableau ;
- value : représente l'étiquette de la colonne de notre tableau.
Évidemment il faudra s'assurer que le tableau à remplir, un QtGui.QTableView(), existe bien.
Ci-dessous, un code d'exemple, où l'on suppose qu'une base de données, contenant une table nommée contact, est correctement ouverte. Dans cette table contact nous y retrouverons, pour chaque ligne :
- le nom ;
- le prénom ;
- la fonction ;
- le téléphone ;
- l'email.
Dans le code, tab représente notre QTableView.
self.model =
QtSql.QSqlTableModel
(
)
self.model.setTable
(
"contact"
)
self.model.select
(
)
self.model.setHeaderData
(
0
, QtCore.Qt.Horizontal, "Nom"
)
self.model.setHeaderData
(
1
, QtCore.Qt.Horizontal, u"Prénom"
)
self.model.setHeaderData
(
2
, QtCore.Qt.Horizontal, "Fonction"
)
self.model.setHeaderData
(
3
, QtCore.Qt.Horizontal, u"Téléphone"
)
self.model.setHeaderData
(
4
, QtCore.Qt.Horizontal, u"Email"
)
tab.setModel
(
self.model)