Ecrire des clés
Voici la fonction de la classe QSettings qui permet d'écrire des clés :
Code : C++1 | void QSettings::setValue ( const QString & key, const QVariant & value )
|
Cette méthode prend donc deux arguments : le nom de la clé et sa valeur.
Gné c'est quoi cet argument
QVariant value... Et si je veux mettre un
int ?
En fait, QVariant est une classe Qt, qui permet de stocker n'importe quel type de variable ou d'objet.
En regardant la doc, on se rend compte que cette classe peut représenter un grand nombre de classes Qt (
la liste complète...).
L'intérêt de cette classe réside dans le fait que l'on peut créer des fonctions qui acceptent tous les types de Qt, comme c'est le cas dans la méthode
setValue ; la fonction se charge alors de convertir la QVariant passée en argument dans le type originel.
De plus, comble du bonheur, vous n'êtes pas obligés de créer un objet QVariant pour utiliser
setValue : indiquez seulement votre objet ou variable, Qt se charge de le transformer en QVariant. Plus simple tu meurs.
Je teste, tu testes, il teste...
Essayons cette fonction avec le fichier d'options que l'on a créé tout à l'heure. Ici, je vais appeler ma clé "test" et elle aura pour valeur "true" (un booléen) :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #include <QApplication>
#include <QWidget>
#include <QSettings>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.show();
QSettings settings("sdz", "MonProgramme");
settings.setValue("test", true);
return app.exec();
}
|
Compilez et exécutez le code (vous verrez toujours la fenêtre vide). Normalement, la clé a dû être écrite (ou alors votre ordi ne marche pas

). Voici ce que vous devriez avoir dans votre fichier d'options :
Et dans le
regedit :
Vous pouvez remarquer la clé appelée "(par défaut)" ;
c'est une fonction spécifique à Windows, cette clé sert à attribuer une valeur à la sous-clé actuelle
(si vous l'utilisez, votre programme ne sera pas portable !)
Y'a un truc qui m'asticote depuis tout à l'heure...
Et si je veux enregistrer un objet qui n'est pas dans la liste de la QVariant ?
Heureusement, les développeurs ont tout prévu : quand le deuxième argument ne peut être stocké dans la QVariant, il est automatiquement converti pour qu'il puisse être stocké. Vous pouvez donc écrire n'importe quel objet, même d'une classe que vous avez créée !
Ecrire des sous-clés
Et voici la fonction qui permet d'écrire des sous-clés...
Code : C++1 | void QSettings::setValue ( const QString & key, const QVariant & value )
|
Eh, mais c'est la même que pour les clés !
Ben oui. Et c'est normal.
En effet, on ne crée pas de sous-clés directement ; elles vont être ajoutées automatiquement en écrivant des clés stockées dans ces sous-clés.
Comment ? Cela va se passer dans le premier argument de la fonction. Je vous avais dit qu'il représentait le nom de la clé, eh bien... je vous ai menti.
On indique en réalité
le chemin de la clé. Oui oui, comme pour un fichier, avec les slashes ! Comme tout à l'heure nous n'avions pas besoin de structurer notre fichier avec des sous-clés, il était inutile d'en créer.
Mais toutes les explications au monde ne vaudront jamais un bon exemple. Ici, je vais créer une clé "nom" avec pour valeur "granarc" et une clé "age" avec pour valeur "13" (eh oui je suis jeune

) ; elles seront toutes les deux stockées dans la sous-clé "Identite".
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #include <QApplication>
#include <QWidget>
#include <QSettings>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.show();
QSettings settings("sdz", "MonProgramme");
settings.setValue("Identite/nom", "granarc");
settings.setValue("Identite/age", 13);
return app.exec();
}
|
Et le résultat dans le fichier d'options :
Et dans le
regedit :
On remarque que dans le fichier, la sous-clé est indiquée par son nom entre crochets
[] (si c'est une sous-sous-clé elle sera indiquée par son chemin, par exemple
Famille/pere=Patrick pour la clé "Identite/Famille/pere"), et dans le
regedit, elle est indiquée par un nouveau dossier dans l'arborescence.
Exercice : écrivez le code qui produirait le fichier suivant :
Code : Autre1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| vivant=true
reel=true
[Identite]
nom=granarc
age=13
Famille/Freres/frere1=Remi
Famille/Soeurs/soeur1=Pauline
Famille/Soeurs/soeur2=Laura
orphelin=false
Famille/mere=Josiane
Famille/pere=Patrick
[Coordonnees]
ville=Martigues
Maison/rue=rue des Lilas
Maison/numero=27
codePostal=13500 |
Compléments
Voici encore trois choses qui pourraient vous être utiles.
Éditer une clé
Pour cela, c'est très simple, si vous utilisez
setValue sur une clé déjà existante, la valeur de cette clé est remplacée par celle que vous demandez.
Supprimer une clé
Utilisez la fonction
remove :
Code : C++1 | void QSettings::remove ( const QString & key )
|
Vous n'avez qu'à indiquer le nom (ou le chemin) de la clé à supprimer.
Se déplacer dans les sous-clés
Si vous avez beaucoup de sous-clés, c'est un peu gavant de réécrire le chemin entier de chaque clé ; si vous avez fait l'exercice proposé au-dessus, vous avez dû le remarquer.
Heureusement, il existe une fonction qui permet de se déplacer dans une sous-clé, qui dit au QSettings : "
Attention, les clés qui vont être écrites maintenant se trouvent dans telle sous-clé".
Il suffit pour cela d'utiliser la méthode
beginGroup qui prend en seul paramètre le nom de la sous-clé dans laquelle aller. Vous pouvez utiliser maintenant
setValue pour écrire vos données ; quand vous avez fini, appelez la méthode
endGroup (ne prend aucun argument), cela vous fera revenir à la racine de votre fichier d'options.
Exemple:
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #include <QApplication>
#include <QWidget>
#include <QSettings>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.show();
QSettings settings("sdz", "MonProgramme");
settings.beginGroup("Identite");
settings.setValue("nom", "granarc");
settings.setValue("age", 13);
settings.endGroup();
return app.exec();
}
|
Ce code donnera la même chose que notre exemple précédent :
Vous avez désormais toutes les cartes en main pour garder en mémoire absolument toute la configuration de votre programme. Cependant, il vous manque une chose essentielle : savoir lire ces informations !