Projet

Général

Profil

QSettings

Création :

Rien de plus simple : le principe, en écriture, est que si ça existe, on écrase, si ça n'existe pas on crée...

 QSettings fichierConfiguration(QDir::homePath()+"/leterrier/monLogicielDuTerrier/conf.perso/parametres.conf", QSettings::IniFormat);

La fonction QDir::homePath() retourne sous forme d'un QString le nom du répertoire personnel quelle que soit la plateforme.
On choisira de l'enregistrer au format "ini".

Sections :

On peut créer des sections à l'intérieur du fichier :

fichierConfiguration.beginGroup(nomDeSection);
    instructions();
fichierConfiguration.endGroup();

La section apparaîtra détachée de la précédente d'un retour-charriot, le nom entre crochets.
On peut créer des sections dans les sections :
fichierConfiguration.beginGroup(nomDeSection1);
    fichierConfiguration.beginGroup(nomDeSection1A);
         instructions();
    fichierConfiguration.endGroup();
    fichierConfiguration.beginGroup(nomDeSection1B);
         instructions();
    fichierConfiguration.endGroup();
fichierConfiguration.endGroup();
fichierConfiguration.beginGroup(nomDeSection2);
    instructions();
fichierConfiguration.endGroup();

Pour chaque instruction correspondant à une section de niveau inférieur, on aura des lignes commençant par "nomDeSection1A\..."

Instructions :

Pour écrire la valeur d'un paramètre :

fichierConfiguration.setValue("nomDuParametre", valeurDuParametre);

La valeurDuParametre peut être de toutes les natures supportées par QVariant
Pour lire la valeur d'un paramètre :
int m_attribut;
m_attribut = fichierConfiguration.value("nomDuParametre").toInt());

... en supposant que mon paramètre soit un entier.

Un exemple pour éclaircir ?

J'écris :

QSettings fichierConfiguration(QDir::homePath()+"/leterrier/monLogicielDuTerrier/conf.perso/films.conf", QSettings::IniFormat);
fichierConfiguration.beginGroup("Les Tontons Flingueurs");
    fichierConfiguration.beginGroup("Acteurs");
         fichierConfiguration.setValue("Fernand Naudin", "Lino Ventura");
         fichierConfiguration.setValue("Maître Folace", "Francis Blanche");
         fichierConfiguration.setValue("Raoul Volfoni", "Bernard Blier");
    fichierConfiguration.endGroup();
    fichierConfiguration.setValue("Réalisateur","Georges Lautner");
    fichierConfiguration.setValue("Dialoguiste","Michel Audiard");
fichierConfiguration.endGroup();
fichierConfiguration.beginGroup("Les Barbouzes");
...

Ce qui devrait donner un fichier films.conf qui ressemble à

[Les Tontons Flingueurs]
Acteurs\Fernand Naudin = Lino Ventura
Acteurs\Maître Folace = Francis Blanche
Acteurs\Raoul Volfoni = Bernard Blier
Réalisateur = Georges Lautner
Dialoguiste = Michel Audiard

[Les Barbouzes]
...

Je veux mettre dans un QLabel le nom de l'acteur qui joue Raoul ("Mais il connaît pas Raoul ce mec ! Moi quand on m'en fait trop, j'corrige plus... je dynamite, je disperse, je ventile")

QSettings fichierConfiguration(QDir::homePath()+"/leterrier/monLogicielDuTerrier/conf.perso/films.conf", QSettings::IniFormat);
fichierConfiguration.beginGroup("Les Tontons Flingueurs");
    fichierConfiguration.beginGroup("Acteurs");
        QLabel personnageFavori(fichierConfiguration.value("Raoul Volfoni").toString());
    fichierConfiguration.endGroup();
fichierConfiguration.endGroup();

Aller plus loin avec les QSettings

Vous pouvez avoir besoin de sauvegarder une liste de longueur variable. Il existe une façon simple de réaliser ceci en utilisant : QSettins::beginWriteArray ( const QString &prefix, int size=-1)

//On crée le fichier de paramètres
QSettings parametres("data/exercices/MonFichierDeParametres.ini", QSettings::IniFormat); 
//J'ouvre un fichier pour récupérer des données (lignes de texte)
QFile monFichier("data/exercices/Mon_fichier_de_texte.txt");
    if(monFichier.open(QFile::ReadOnly| QIODevice::Text))
    {
        QTextStream in(&monFichier);

        int i=0;
// C'est ici que c'est intéressant On prépare une sous-section appelée "paroles" 
        parametres.beginWriteArray("paroles");
// On lit le fichier lignes par lignes
        while (!in.atEnd())
        {
            QString line = in.readLine();
            //L'index est fixé à i
            parametres.setArrayIndex(i);
            i++;
// On écrit les valeurs des clés "ligne" et "temps" 
            parametres.setValue("ligne", line);
            // Je convertis le nombre en QString parce que ça m'arrange, mais c'est pas obligé
            parametres.setValue("temps",QString::number(MonTemps));
        }
Quand la lecture du fichier texte est terminée, on ferme la section.
        parametres.endArray();
    }

On obtient alors un fichier .ini qui ressemble à ça :

[paroles]
1\ligne="      La Gadoue" 
1\temps=4000
2\ligne=
2\temps=8000
3\ligne=Du mois de septembre au mois d'ao\xfbt
3\temps=12000
4\ligne=Faudrait des bottes de caoutchouc
4\temps=16000
....
58\ligne="Ouh ! La gadoue, la gadoue, la gadoue" 
58\temps=232000
59\ligne="Ouh ! la gadoue, la gadoue" 
59\temps=236000
size=59

On peut remarquer que la clé "size" a été insérée automatiquement avec la valeur correspondant au nombre de sous-clé créées. (Utile !)

Pour lire ce fichier, ce n'est pas plus difficile :

//On récupère notre fichier de paramètres
if(QFile::exists(fichierParametres))
    {
        //Il y a un fichier de paramètres
        QSettings parametres(fichierParametres,QSettings::IniFormat);
        // C'est magique, on récupère la taille du tableau directement
        int taille =  parametres.beginReadArray("paroles");

        // Quelques bricoles !
        ...
        ...
        // Et on boucle sur le nombre d'entrée dans la zone [paroles]
        for(int i=0; i<taille;i++)
        {
            //On incrémente l'index
            parametres.setArrayIndex(i);

            // On récupère la valeur du temps et on lui fait subir quelques outrages
            qint64 valTime=parametres.value("temps").toInt();
            ...
            ...
            // On récupère la ligne de texte
            QString maChaine=parametres.value("ligne").toString();
            ...
            ...
        }
// Et on ferme la zone
        parametres.endArray();
    }

Il est possible d'accéder directement à une valeur par son index(vérifier qu'il est inférieur à la valeur de size) avec setArrayIndex(int) après avoir appelé beginReadArray() ou beginWriteArray()

Et voilà !

Redmine Appliance - Powered by TurnKey Linux