Lire et sauver des informations dans une base de données

Question

  1. A l'aide de phpMyAdmin, créez la base de données nommée bddFormation (si ce n'est pas déjà fait !) et la table user conformément à la partie précédente "Accès à une base de données MySQL".

  2. Remplissez la table avec des valeurs de votre choix.

  3. Concevez un programme nommé appSgbd ayant une IHM composée de 2 parties. La première permet d'afficher la liste des noms de la table user. En cliquant sur un nom, il est possible de mettre à jour le nom et login ou d'effacer cet utilisateur.

  4. La deuxième partie permet la création d'un nouvel utilisateur (vous pouvez vous inspirer de l'IHM ci-dessous).

IHM de l'application appSgbd
IHM de l'application appSgbd

Indice

Connexion à la base de données : Utilisation de la méthode statique de QSqlDatabase en précisant le pilote à utiliser :

1
db = QSqlDatabase::addDatabase("QMYSQL");

Widget QListView : Quand on clique sur une ligne de la QListView, le signal clicked(QModelIndex) est émis. Il faut capter ce signal et le raccorder à un slot de la classe.

1
connect(ui->lvTable, SIGNAL(clicked(QModelIndex)), this, SLOT(onSelectLineList(QModelIndex)));

Ici, le signal clicked(QModelIndex) du widget QListView est connecté au slot onSelectLineList(QModelIndex) créé dans la classe CIhmAppSgbd.

Le paramètre émis avec le signal (QModelIndex) désigne l'objet de gestion de la ligne sélectionnée.

1
void CIhmAppSgbd::onSelectLineList(QModelIndex mi)
2
{
3
  QSqlQuery q(db);
4
  q.prepare("SELECT * FROM user WHERE login=:login");
5
  q.bindValue(":login", mi.data().toString());
6
  q.exec();
7
  q.next();
8
  ui->leModifLogin->setText(q.value("login").toString());
9
  ui->leModifNom->setText(q.value("nom").toString());
10
  ui->lId->setText(q.value("id").toString());
11
}

La méthode data() de l'objet mi permet d'accéder au contenu de la ligne.

Solution

Le fichier appSgbd.pro
1
#-------------------------------------------------
2
#
3
# Project created by QtCreator 2016-03-17T08:19:26
4
#
5
#-------------------------------------------------
6
7
QT       += core gui sql
8
9
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10
11
TARGET = essaiQMYSQL
12
TEMPLATE = app
13
14
SOURCES += main.cpp \
15
    cihmappsgbd.cpp
16
17
HEADERS  += \
18
    cihmappsgbd.h
19
20
FORMS    += \
21
    cihmappsgbd.ui
22

N'oubliez pas d'ajouter le module Qt sql afin d'avoir accès aux classes de gestion d'un SGBD.

Le fichier cihmappsgbd.h
1
#ifndef MAINWINDOW_H
2
#define MAINWINDOW_H
3
4
#include <QMainWindow>
5
#include <QSqlDatabase>
6
#include <QSqlError>
7
#include <QSqlQuery>
8
#include <QStringList>
9
#include <QStringListModel>
10
#include <QDebug>
11
12
namespace Ui {
13
class CIhmAppSgbd;
14
}
15
16
class CIhmAppSgbd : public QMainWindow
17
{
18
    Q_OBJECT
19
20
public:
21
    explicit CIhmAppSgbd(QWidget *parent = 0);
22
    ~CIhmAppSgbd();
23
24
private slots:
25
    void on_pbExtraire_clicked();
26
    void on_pbAjouter_clicked();
27
    void on_pbEffacer_clicked();
28
    void on_pbModifier_clicked();
29
    void onSelectLineList(QModelIndex mi);
30
31
private:
32
    Ui::CIhmAppSgbd *ui;
33
    QSqlDatabase db;
34
    QStringListModel *model;
35
};
36
37
#endif // MAINWINDOW_H
38

La méthode onSelectLineList(QModelIndex mi) est un slot invoqué lors du clique sur une ligne du QListView.

Le fichier cihmappsgbd.cpp
1
#include "cihmappsgbd.h"
2
#include "ui_cihmappsgbd.h"
3
4
CIhmAppSgbd::CIhmAppSgbd(QWidget *parent) :
5
    QMainWindow(parent),
6
    ui(new Ui::CIhmAppSgbd)
7
{
8
    QSqlError err;
9
10
    // init
11
    ui->setupUi(this);
12
    ui->lId->setVisible(false);
13
    model=NULL;
14
15
    // connexion à la bdd
16
    db = QSqlDatabase::addDatabase("QMYSQL");
17
    db.setHostName("localhost");
18
    db.setDatabaseName("bddFormation");
19
    db.setUserName("user");
20
    db.setPassword("user");
21
    bool ok = db.open();
22
    if (!ok) {
23
        err = db.lastError();
24
        qDebug() << err.text();
25
    } else
26
        qDebug() << "Connexion à la BDD " << ok;
27
28
    // click dans zone de liste
29
    connect(ui->lvTable, SIGNAL(clicked(QModelIndex)), this, SLOT(onSelectLineList(QModelIndex)));
30
}
31
32
CIhmAppSgbd::~CIhmAppSgbd()
33
{
34
    delete model;
35
    delete ui;
36
}
37
38
void CIhmAppSgbd::on_pbExtraire_clicked()
39
{
40
    if (model != NULL)
41
        delete model;
42
    model = new QStringListModel(this);
43
    QStringList liste;
44
    QSqlQuery q(db);
45
    q.exec("SELECT * FROM user ORDER BY nom");
46
    while (q.next()) {
47
        liste << q.value("login").toString();
48
    } // for
49
    model->setStringList(liste);
50
    ui->lvTable->setModel(model);
51
}
52
53
void CIhmAppSgbd::on_pbAjouter_clicked()
54
{
55
    QSqlQuery q(db);
56
    q.prepare("INSERT INTO user VALUES (NULL, :name, :pname, :login, SHA1(:mdp))");
57
    q.bindValue(":name", ui->leNom->text());
58
    q.bindValue(":pname", ui->lePnom->text());
59
    q.bindValue(":login", ui->leLogin->text());
60
    q.bindValue(":mdp", ui->leMdp->text());
61
    q.exec();
62
    on_pbExtraire_clicked();
63
    ui->leNom->clear();
64
    ui->lePnom->clear();
65
    ui->leLogin->clear();
66
    ui->leMdp->clear();
67
}
68
69
void CIhmAppSgbd::on_pbEffacer_clicked()
70
{
71
    QSqlQuery q(db);
72
    q.prepare("DELETE FROM user WHERE id=:id");
73
    q.bindValue(":id", ui->lId->text());
74
    q.exec();
75
    on_pbExtraire_clicked();
76
    ui->leModifNom->clear();
77
    ui->leModifLogin->clear();
78
    ui->lId->clear();
79
}
80
81
void CIhmAppSgbd::on_pbModifier_clicked()
82
{
83
    QSqlQuery q(db);
84
    q.prepare("UPDATE user SET nom=:nom, login=:login WHERE id=:id");
85
    q.bindValue(":id", ui->lId->text().toInt());
86
    q.bindValue(":nom", ui->leModifNom->text());
87
    q.bindValue(":login", ui->leModifLogin->text());
88
    q.exec();
89
    on_pbExtraire_clicked();
90
}
91
92
void CIhmAppSgbd::onSelectLineList(QModelIndex mi)
93
{
94
  QSqlQuery q(db);
95
  q.prepare("SELECT * FROM user WHERE login=:login");
96
  q.bindValue(":login", mi.data().toString());
97
  q.exec();
98
  q.next();
99
  ui->leModifLogin->setText(q.value("login").toString());
100
  ui->leModifNom->setText(q.value("nom").toString());
101
  ui->lId->setText(q.value("id").toString());
102
}
103

Le contenu du QListView est construit de la manière suivante (voir on_pbExtraire_clicked()) :

  • Construction d'un QListString, un objet gérant une liste de chaine de caractères.

  • Construction d'un QStringListModel, un objet gérant cette liste, mais compatible avec la QListView.

  • Enfin la méthode setModel() permettant d'intégrer la liste dans le widget d'affichage.

Le fichier cihmappsgbd.ui
1
<?xml version="1.0" encoding="UTF-8"?>
2
<ui version="4.0">
3
 <class>CIhmAppSgbd</class>
4
 <widget class="QMainWindow" name="CIhmAppSgbd">
5
  <property name="geometry">
6
   <rect>
7
    <x>0</x>
8
    <y>0</y>
9
    <width>1352</width>
10
    <height>813</height>
11
   </rect>
12
  </property>
13
  <property name="windowTitle">
14
   <string>appSgbd</string>
15
  </property>
16
  <widget class="QWidget" name="centralWidget">
17
   <widget class="QListView" name="lvTable">
18
    <property name="geometry">
19
     <rect>
20
      <x>20</x>
21
      <y>90</y>
22
      <width>551</width>
23
      <height>421</height>
24
     </rect>
25
    </property>
26
   </widget>
27
   <widget class="QPushButton" name="pbExtraire">
28
    <property name="geometry">
29
     <rect>
30
      <x>20</x>
31
      <y>30</y>
32
      <width>541</width>
33
      <height>48</height>
34
     </rect>
35
    </property>
36
    <property name="text">
37
     <string>Extraire les utilisateurs</string>
38
    </property>
39
   </widget>
40
   <widget class="QGroupBox" name="gbAjouter">
41
    <property name="geometry">
42
     <rect>
43
      <x>650</x>
44
      <y>30</y>
45
      <width>651</width>
46
      <height>421</height>
47
     </rect>
48
    </property>
49
    <property name="title">
50
     <string>Ajouter</string>
51
    </property>
52
    <widget class="QWidget" name="layoutWidget">
53
     <property name="geometry">
54
      <rect>
55
       <x>290</x>
56
       <y>60</y>
57
       <width>348</width>
58
       <height>211</height>
59
      </rect>
60
     </property>
61
     <layout class="QVBoxLayout" name="verticalLayout">
62
      <item>
63
       <widget class="QLineEdit" name="leNom"/>
64
      </item>
65
      <item>
66
       <widget class="QLineEdit" name="lePnom"/>
67
      </item>
68
      <item>
69
       <widget class="QLineEdit" name="leLogin"/>
70
      </item>
71
      <item>
72
       <widget class="QLineEdit" name="leMdp">
73
        <property name="echoMode">
74
         <enum>QLineEdit::Password</enum>
75
        </property>
76
       </widget>
77
      </item>
78
     </layout>
79
    </widget>
80
    <widget class="QPushButton" name="pbAjouter">
81
     <property name="geometry">
82
      <rect>
83
       <x>120</x>
84
       <y>330</y>
85
       <width>391</width>
86
       <height>48</height>
87
      </rect>
88
     </property>
89
     <property name="text">
90
      <string>Ajouter un utilisateur</string>
91
     </property>
92
    </widget>
93
    <widget class="QWidget" name="layoutWidget">
94
     <property name="geometry">
95
      <rect>
96
       <x>20</x>
97
       <y>60</y>
98
       <width>250</width>
99
       <height>211</height>
100
      </rect>
101
     </property>
102
     <layout class="QVBoxLayout" name="verticalLayout_2">
103
      <item>
104
       <widget class="QLabel" name="label">
105
        <property name="text">
106
         <string>Nom : </string>
107
        </property>
108
       </widget>
109
      </item>
110
      <item>
111
       <widget class="QLabel" name="label_2">
112
        <property name="text">
113
         <string>Prénom : </string>
114
        </property>
115
       </widget>
116
      </item>
117
      <item>
118
       <widget class="QLabel" name="label_3">
119
        <property name="text">
120
         <string>Login : </string>
121
        </property>
122
       </widget>
123
      </item>
124
      <item>
125
       <widget class="QLabel" name="label_4">
126
        <property name="text">
127
         <string>Mot de passe : </string>
128
        </property>
129
       </widget>
130
      </item>
131
     </layout>
132
    </widget>
133
   </widget>
134
   <widget class="QGroupBox" name="gbModifier">
135
    <property name="geometry">
136
     <rect>
137
      <x>20</x>
138
      <y>520</y>
139
      <width>1021</width>
140
      <height>181</height>
141
     </rect>
142
    </property>
143
    <property name="title">
144
     <string>Modifier</string>
145
    </property>
146
    <widget class="QLabel" name="lId">
147
     <property name="geometry">
148
      <rect>
149
       <x>700</x>
150
       <y>140</y>
151
       <width>161</width>
152
       <height>39</height>
153
      </rect>
154
     </property>
155
     <property name="text">
156
      <string/>
157
     </property>
158
    </widget>
159
    <widget class="QWidget" name="layoutWidget">
160
     <property name="geometry">
161
      <rect>
162
       <x>30</x>
163
       <y>60</y>
164
       <width>160</width>
165
       <height>101</height>
166
      </rect>
167
     </property>
168
     <layout class="QVBoxLayout" name="verticalLayout_3">
169
      <item>
170
       <widget class="QLabel" name="label_5">
171
        <property name="text">
172
         <string>Nom : </string>
173
        </property>
174
       </widget>
175
      </item>
176
      <item>
177
       <widget class="QLabel" name="label_6">
178
        <property name="text">
179
         <string>Login :</string>
180
        </property>
181
       </widget>
182
      </item>
183
     </layout>
184
    </widget>
185
    <widget class="QWidget" name="layoutWidget">
186
     <property name="geometry">
187
      <rect>
188
       <x>210</x>
189
       <y>60</y>
190
       <width>348</width>
191
       <height>103</height>
192
      </rect>
193
     </property>
194
     <layout class="QVBoxLayout" name="verticalLayout_4">
195
      <item>
196
       <widget class="QLineEdit" name="leModifNom"/>
197
      </item>
198
      <item>
199
       <widget class="QLineEdit" name="leModifLogin"/>
200
      </item>
201
     </layout>
202
    </widget>
203
    <widget class="QWidget" name="layoutWidget">
204
     <property name="geometry">
205
      <rect>
206
       <x>580</x>
207
       <y>80</y>
208
       <width>411</width>
209
       <height>50</height>
210
      </rect>
211
     </property>
212
     <layout class="QHBoxLayout" name="horizontalLayout">
213
      <item>
214
       <widget class="QPushButton" name="pbEffacer">
215
        <property name="text">
216
         <string>Effacer</string>
217
        </property>
218
       </widget>
219
      </item>
220
      <item>
221
       <widget class="QPushButton" name="pbModifier">
222
        <property name="text">
223
         <string>Modifier</string>
224
        </property>
225
       </widget>
226
      </item>
227
     </layout>
228
    </widget>
229
   </widget>
230
  </widget>
231
  <widget class="QMenuBar" name="menuBar">
232
   <property name="geometry">
233
    <rect>
234
     <x>0</x>
235
     <y>0</y>
236
     <width>1352</width>
237
     <height>44</height>
238
    </rect>
239
   </property>
240
  </widget>
241
  <widget class="QToolBar" name="mainToolBar">
242
   <attribute name="toolBarArea">
243
    <enum>TopToolBarArea</enum>
244
   </attribute>
245
   <attribute name="toolBarBreak">
246
    <bool>false</bool>
247
   </attribute>
248
  </widget>
249
  <widget class="QStatusBar" name="statusBar"/>
250
 </widget>
251
 <layoutdefault spacing="6" margin="11"/>
252
 <resources/>
253
 <connections/>
254
</ui>
255