IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Accès au fichier config.ini

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut Accès au fichier config.ini
    Bonjour,

    Je suis en train de développer une application avec Qt.
    Je débute dans la programmation sur Qt.

    Mon problème est le suivant, je n'arrive pas à accéder à mes paramètres de configuration du fichier config.ini.
    Le fichier config.ini est dans le même dossier que mon exécutable Qt.

    En utilisant la ligne de code suivante dans le fichier mainwindow.cpp :
    QSettings settings( QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);

    J'ai une erreur lors de la compilation :
    QCoreApplication::applicationDirPath: Please instantiate the QApplication object first
    Le programme s'est terminé subitement.


    De plus, les paramètres de configuration ne sont pas chargés.

    Par contre si j'utilise le chemin absolu, les paramètres sont bien chargés.
    QSettings settings( "C:/wamp/www/qt/config.ini", QSettings::IniFormat);

    Pourriez-vous me donner des pistes ?
    Merci d'avance...

    Voici le contenu de mes fichiers :
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <QApplication>
    #include <QTranslator>
    #include <QLibraryInfo>
    #include <QLocale>
     
    #include "mainwindow.h"
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        // pour avoir les boutons des boîtes de dialogue dans la langue locale (fr par défaut)
        QTranslator qtTranslator;
        qtTranslator.load( "qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath) );
        a.installTranslator(&qtTranslator);
     
        MainWindow w;
        w.show();
     
        return a.exec();
    }
    mainwindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QtCore/QVariant>
    #include <QtCore/QCryptographicHash>
     
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QMessageBox>
    #include <QtGui/QDialogButtonBox>
    #include <QtGui/QComboBox>
    #include <QtGui/QDateEdit>
    #include <QtGui/QFormLayout>
    #include <QtGui/QGroupBox>
    #include <QtGui/QHBoxLayout>
    #include <QtGui/QHeaderView>
    #include <QtGui/QLabel>
    #include <QtGui/QLineEdit>
    #include <QtGui/QPlainTextEdit>
    #include <QtGui/QMainWindow>
    #include <QtGui/QToolButton>
    #include <QtGui/QVBoxLayout>
    #include <QtGui/QWidget>
    #include <QtGui/QFileDialog>
    #include <QtGui/QProgressBar>
     
    #include <QtNetwork/QNetworkAccessManager>
    #include <QtNetwork/QNetworkRequest>
    #include <QtNetwork/QNetworkReply>
     
    #include <QtScript/QScriptEngine>
    #include <QtScript/QScriptValueIterator>
     
    #include <QFtp>
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow();
        ~MainWindow();
     
        static QString CheminAbsoluFichierIni;
        static QString url;
        static QString FTPhost;
        static QString FTPlogin;
        static QString FTPpassword;
        static quint16 FTPport;
    ...
    };
     
    #endif // MAINWINDOW_H
    mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <QApplication>
    #include <QSettings>
    #include <QDateTime>
     
    #include "mainwindow.h"
     
    /**
     * Initialisation des variables statiques à configurer
     */
    // Ouverture du fichier INI
    QSettings settings( QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
     
    // Addresse 
    QString MainWindow::SITurl = settings.value("WebService/url","http://www.mon-url-par-defaut.com").toString();
     
    // Addresse du serveur FTP
    QString MainWindow::FTPhost = settings.value("Serveur/FTPhost","127.0.0.1").toString();
    QString MainWindow::FTPlogin = settings.value("Serveur/FTPlogin","anonymous").toString();
    QString MainWindow::FTPpassword = settings.value("Serveur/FTPpassword","").toString();
    quint16 MainWindow::FTPport = settings.value("Serveur/FTPport","21").toInt();
     
    MainWindow::MainWindow() : QMainWindow(){
        this->setupUi();
    }
     
    MainWindow::~MainWindow()
    {
        delete this;
    }
     
    /*...*/
    config.ini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [WebService]
    url=http://mon-url.com
     
    [ServeurVideo]
    FTPhost=127.0.0.1
    FTPlogin=ftp
    FTPpassword=pass
    FTPport=21

  2. #2
    Invité
    Invité(e)
    Par défaut
    Le message d'erreur me semble clair: pour utiliser applicationDirPath, il faut instancier un QApplication. Si je comprends bien, tu voudrais récupérer le chemin absolu de ton programme pour ensuite ouvrir ton le fichier CHEMIN_ABSOLU/config.ini ? Si c'est bien cela, tu ne devrais pas avoir besoin du chemin absolu, un chemin relatif fera tout aussi bien l'affaire!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QSettings settings( "./config.ini", QSettings::IniFormat);
    Je n'ai pas vérifié, mais je pense que ça marche
    Dernière modification par Invité ; 30/12/2012 à 21h14. Motif: Correction apportée après remarque de koala01

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Dreamker Voir le message
    Le message d'erreur me semble clair: pour utiliser applicationDirPath, il faut instancier un QApplication. Si je comprends bien, tu voudrais récupérer le chemin absolu de ton programme pour ensuite ouvrir ton le fichier CHEMIN_ABSOLU/config.ini ? Si c'est bien cela, tu ne devrais pas avoir besoin du chemin absolu, un chemin relatif fera tout aussi bien l'affaire!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QSettings settings( "/config.ini", QSettings::IniFormat);
    Je n'ai pas vérifié, mais je pense que ça marche
    En fait, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QSettings settings( "./config.ini", QSettings::IniFormat);
    ira sans doute beaucoup mieux (il manquait un point avant le / )

    Mais, en effet, le message d'erreur est parfaitement clair : tu dois veiller à ce que ton instance de QApplication soit créée avant de vouloir accéder à QApplication::applicationDirPath

    Le gros problème vient du fait que tu semble vouloir gérer ton QSettings comme une variable globale... C'est une très mauvaise idée

    ... Tout comme c'est une très mauvaise idée de vouloir gérer les différentes chaines de caractères sous forme de membre statiques, d'ailleurs

    De toute évidence, tu n'as sans doute pas réfléchi suffisamment à la séparation de tes différentes responsabilités, et tu as fini par rendre "tout et n'importe quoi" responsable du fait d'aller travailler en FTP

    Or, quand on y pense, les endroit où il est nécessaire de se connecter via FTP devraient être relativement peut nombreux et devraient se cantonner à un "petit ensemble" que l'on pourrait regrouper sous le terme de "transmission de données", et qui pourrait, d'ailleurs, se présenter comme un module tout à fait séparé

    Je m'explique :

    Quand tu y penses, tu ne devrais avoir besoin des informations concernant le serveur FTP que :
    1. lorsque tu veux aller chercher quelque chose sur le FTP
    2. lorsque tu veux envoyer quelque chose sur le FTP
    3. lorsque tu veux (éventuellement) modifier les informations de connexion au FTP.

    En dehors de cela, tu n'as aucune raison de vouloir accéder aux données de connexion au FTP

    De même, tu n'as, a priori, aucune raison de vouloir accéder au contenu de ton QSettings en dehors d'un domaine tout particulier qui est... la gestion et la sauvegarde des données de configuration.

    Ce que je veux dire par là, c'est que, dans le pire des cas, tu auras créé un "panneau de configuration" qui regroupera la possibilité de gérer différentes options.

    Ce panneau de configuration est le seul endroit en définitive où tu devrais te retrouver avec la possibilité d'accéder à l'ensemble des options de ton programme!

    Je ne connais pas le contenu de ton config.ini, et il m'est donc difficile de te parler de termes que tu as toi meme utilisé, mais, en gros, chaque section de ton fichier correspond (ou devrait correspondre ) à un "module séparé et autonome", ou peut s'en faut.

    Chaque module devrait en effet pouvoir travailler de manière presque totalement indépendante des autres modules, bien qu'il soit sans doute nécessaire de prévoir un certain nombre de "passerelles" entre certains de ces modules

    Et l'une des passerelles entre ces différents modules n'est autre que... ton panneau de configuration, qui va regrouper les informations qu'il pourra récupérer dans les différents modules de manière à pouvoir toutes les afficher et les envoyer, si besoin en est, vers le fichier de configuration(... ou pour aller modifier les options propres à chaque module)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    En utilisant le chemin relatif avec la ligne suivante :
    QSettings settings( "./config.ini", QSettings::IniFormat);

    Ainsi qu'en déposant mon fichier config.ini dans le dossier build-Desktop-Release
    j'ai pu avoir accès aux informations de configuration.

    Merci pour votre aide.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Mauvaise idée, le chemin relatif, si jamais l'application est lancée depuis un lanceur, une ligne de commande, etc., le chemin courant ne serait plus le bon, d'où l'intérêt de concaténer avec le répertoire de l'exécutable pour avoir un chemin absolu.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Si j'essaie de récupérer le chemin absolu avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QSettings settings( QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
    J'ai une erreur lors de la compilation :
    QCoreApplication::applicationDirPath: Please instantiate the QApplication object first
    Le programme s'est terminé subitement.

    Et en plus, les paramètres de configuration ne sont pas chargés.

    Si j'ai une solution pour résoudre ce problème c'est sur que c'est la meilleure solution à utiliser.

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    La raison de ton problème a été bien expliquée par koala01, et l'erreur est très claire. Tu ne dois pas déclarer statiquement ton QSettings.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    J'ai effectué les mises ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QSettings *config;
    config = new QSettings settings( QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
    J'ai les erreurs suivante à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur : 'config' does not name a type
    Et à chaque appel de ma variable settings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur : 'settings' was not declared in this scope
    Comment résoudre le problème ?

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Comment est-ce que tu comprends tes deux lignes de code là ? En français, qu'essayes-tu de déclarer ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Je déclare ma variable config de type QSettings.
    Ensuite, je lui donne comme valeur settings de type QSettings avec les paramètres QApplication::applicationDirPath() + "/config.ini" et QSettings::IniFormat

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    J'ai trouvé une solution pour pouvoir charger accéder à mes paramètres de configuration du fichier config.ini (inclus dans le même dossier que mon exécutable).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Ouverture du fichier INI
    // Chemin absolu
    QString m_CheminAbsoluFichierIni = QDir::currentPath() + "/config.ini";
    QSettings settings(m_CheminAbsoluFichierIni, QSettings::IniFormat);
    // Chemin relatif
    //QSettings settings("./config.ini", QSettings::IniFormat);
    Avec cette commande, mon fichier de configuration est chargé en utilisant le chemin absolu.

    Attention à ne pas oublier l'include en début de fichier :
    Merci à tous pour votre aide.

  12. #12
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    http://doc.qt.digia.com/qt/qdir.html#currentPath

    Désolé mais ça revient au même qu'un chemin relatif. Le répertoire courant n'est pas forcément le répertoire de l'exe donc cette méthode n'est pas bonne du tout.

    Exemple, si tu ouvres une fenêtre de commande :
    => répertoire courant : C:
    Tu lances l'appli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\>D:\Applications\MonProjet\MonProjet.exe
    => il va chercher C:\config.ini

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Je viens de tester de lancer mon fichier .exe avec une fenêtre de commande.

    E:\>C:\MonApplication\Appli.exe
    Les paramètres de configuration sont bien chargés de mon fichier config.ini (dans C:\MonApplication\config.ini).

    Par contre après validation sur mon application, des variables doivent être mises à jour et dans ce cas, un nouveau fichier config.ini est créé à la racide du disque E:\> pour y intégrer mes mises à jour.

    Si l’on relance l’application avec la fenêtre de commande, tous les paramètres sont bien chargés (les 2 fichiers de configurations sont pris en compte).

    Quelle est la solution optimale pour arriver à charger mon fichier de configuration avec un chemin absolu ?

  14. #14
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Celle que tu utilisais depuis le début, avec le chemin du dossier de l'application.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2012
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    J'ai utilisé cette ligne de commande pour récupérer le chemin absolu de mon fichier de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QSettings settings( QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fichier config.ini et internationalisation
    Par Supersonik dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 26/05/2011, 15h08
  2. [C#][VS2K5]Acces au fichier App.Config en lecture / écriture
    Par gassisprog dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/05/2008, 15h17
  3. Format du fichier de config : .ini ou .xml ?
    Par LapinGarou dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 30/06/2007, 10h44
  4. [Info]Accès à un fichier de config
    Par tomca dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 02/11/2005, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo