Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Save values to a config file
Forum Updated to NodeBB v4.3 + New Features

Save values to a config file

Scheduled Pinned Locked Moved Solved General and Desktop
43 Posts 7 Posters 8.3k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JoeCFDJ Offline
    JoeCFDJ Offline
    JoeCFD
    wrote on last edited by
    #2

    QSettings provides no way of reading INI "path" entries, i.e., entries with unescaped slash characters. (This is because these entries are ambiguous and cannot be resolved automatically.)
    https://doc.qt.io/qt-5/qsettings.html#QSettings-3

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mchinand
      wrote on last edited by mchinand
      #3

      @Sucharek said in Save values to a config file:

      QSettings settings(QString(":/config/config.ini"), QSettings::IniFormat);

      I don't think you can store the settings in a resource file (":/config..."). Changing a setting would mean the executable would need to be modified during execution.

      1 Reply Last reply
      6
      • S Sucharek

        Hi, I want to save some variable values into a config file.
        I tried doing it with QSettings and resources, but it doesn't seem to work.

        My mainwindow.h

        #ifndef MAINWINDOW_H
        #define MAINWINDOW_H
        
        #include <QMainWindow>
        #include <QSettings>
        #include <QDebug>
        
        QT_BEGIN_NAMESPACE
        namespace Ui { class MainWindow; }
        QT_END_NAMESPACE
        
        class MainWindow : public QMainWindow
        {
            Q_OBJECT
        
        public:
            MainWindow(QWidget *parent = nullptr);
            ~MainWindow();
        
        private slots:
            void on_pushButton_clicked();
        
            void on_horizontalSlider_valueChanged(int value);
        
        private:
            Ui::MainWindow *ui;
        };
        #endif // MAINWINDOW_H
        
        

        My mainwindow.cpp

        #include "mainwindow.h"
        #include "ui_mainwindow.h"
        
        MainWindow::MainWindow(QWidget *parent)
            : QMainWindow(parent)
            , ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
        }
        
        int test;
        int someValue;
        
        MainWindow::~MainWindow()
        {
            delete ui;
        }
        
        void MainWindow::on_pushButton_clicked()
        {
            QSettings settings(QString(":/config/config.ini"), QSettings::IniFormat);
            settings.setValue("clicks/config", test);
            someValue = settings.value("clicks/config", "").toInt();
            qDebug() << someValue;
        }
        
        void MainWindow::on_horizontalSlider_valueChanged(int value)
        {
            test = value;
        }
        
        

        The resources
        8be1dd2a-4731-4364-ad35-b80377201d7f-image.png
        And the config.ini file

        [clicks]
        config=5
        
        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #4

        @Sucharek said in Save values to a config file:

        QSettings settings(QString(":/config/config.ini"), QSettings::IniFormat);

        As @mchinand has said. Start by checking settings.isWritable() after this line

        One reason why isWritable() might return false is if QSettings operates on a read-only file.

        You might also check QSettings::status() for an error.

        1 Reply Last reply
        0
        • S Offline
          S Offline
          Sucharek
          wrote on last edited by
          #5

          Hi, sorry for the late response. I was away for about 3 hours, but I'm back now.
          I've tried the settings.isWritable() but that didn't work.
          I also didn't understand the QSettings::status(). Could you give me an example please?

          M JonBJ 2 Replies Last reply
          0
          • S Sucharek

            Hi, sorry for the late response. I was away for about 3 hours, but I'm back now.
            I've tried the settings.isWritable() but that didn't work.
            I also didn't understand the QSettings::status(). Could you give me an example please?

            M Offline
            M Offline
            mchinand
            wrote on last edited by
            #6

            What was the value returned by settings.isWritable()?

            1 Reply Last reply
            0
            • S Sucharek

              Hi, sorry for the late response. I was away for about 3 hours, but I'm back now.
              I've tried the settings.isWritable() but that didn't work.
              I also didn't understand the QSettings::status(). Could you give me an example please?

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by JonB
              #7

              @Sucharek said in Save values to a config file:

              I've tried the settings.isWritable() but that didn't work.

              It's not supposed to "make it work"! It's supposed to tell you why it likely isn't working.

              We're trying to tell you that you cannot save settings to a resource file.

              1 Reply Last reply
              0
              • S Offline
                S Offline
                Sucharek
                wrote on last edited by
                #8

                It didn't output anything

                JonBJ M 2 Replies Last reply
                0
                • S Sucharek

                  It didn't output anything

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by
                  #9

                  @Sucharek said in Save values to a config file:

                  It didn't output anything

                  Please use the documentation to understand.

                  1 Reply Last reply
                  0
                  • S Sucharek

                    It didn't output anything

                    M Offline
                    M Offline
                    mchinand
                    wrote on last edited by
                    #10

                    @Sucharek

                    What is the output of
                    qDebug() << "Is Settings Writeable? " << settings.isWritable();

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      Sucharek
                      wrote on last edited by
                      #11

                      Ok, here's the output:
                      f7d2302d-f00d-4ab6-acbb-7770c403c48f-image.png
                      I've also added:

                      qDebug() << "Settings status: " << settings.status();
                      

                      Which is the "Settings status: ".

                      JonBJ 1 Reply Last reply
                      0
                      • S Sucharek

                        Ok, here's the output:
                        f7d2302d-f00d-4ab6-acbb-7770c403c48f-image.png
                        I've also added:

                        qDebug() << "Settings status: " << settings.status();
                        

                        Which is the "Settings status: ".

                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by JonB
                        #12

                        @Sucharek
                        So it isn't writeable. Which we already know, because resource files are not writeable. You cannot set settings in a resource file. That's the answer.

                        Hi, I want to save some variable values into a config file.

                        I tried doing it with QSettings and resources, but it doesn't seem to work.

                        Yes, it does not work.

                        1 Reply Last reply
                        3
                        • S Offline
                          S Offline
                          Sucharek
                          wrote on last edited by
                          #13

                          Ok, so , can I use like a full path? (C:/...)

                          M 1 Reply Last reply
                          0
                          • S Sucharek

                            Ok, so , can I use like a full path? (C:/...)

                            M Offline
                            M Offline
                            mchinand
                            wrote on last edited by
                            #14

                            No, resource files don't have a location on disk that you can specify other than how you have above (:/...), they are stored embedded in the executable.

                            1 Reply Last reply
                            0
                            • SGaistS Offline
                              SGaistS Offline
                              SGaist
                              Lifetime Qt Champion
                              wrote on last edited by
                              #15

                              Hi,

                              If you properly configure your QApplication, QSettings will by default store your settings in the appropriate location for the OS your application runs on.

                              If you really want to have a file, then use QStandardPaths to query a suitable folder.

                              Interested in AI ? www.idiap.ch
                              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1
                              • S Offline
                                S Offline
                                Sucharek
                                wrote on last edited by
                                #16

                                Ok, so how do I store it in the :/config.ini now?

                                1 Reply Last reply
                                0
                                • SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #17

                                  As was already explained several times by my fellows on this thread: you cannot write in the resources.

                                  These are read-only data embedded in your executable.

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  S 1 Reply Last reply
                                  2
                                  • SGaistS SGaist

                                    As was already explained several times by my fellows on this thread: you cannot write in the resources.

                                    These are read-only data embedded in your executable.

                                    S Offline
                                    S Offline
                                    Sucharek
                                    wrote on last edited by
                                    #18

                                    Oh, ok so now can I use the QStandardPaths? And if so, how?

                                    1 Reply Last reply
                                    0
                                    • SGaistS Offline
                                      SGaistS Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #19

                                      Where do you want to store your configuration ?

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      1 Reply Last reply
                                      0
                                      • S Offline
                                        S Offline
                                        Sucharek
                                        wrote on last edited by
                                        #20

                                        Well, I'm building the app for an Android device, so I would put it to: /data/data/org.qtproject.example.clicker/
                                        if reading/writing to that folder isn't possible (without root), I would put it to:
                                        /sdcard/Android/data/org.qtproject.example.clicker/

                                        J.HilkJ 1 Reply Last reply
                                        0
                                        • S Sucharek

                                          Well, I'm building the app for an Android device, so I would put it to: /data/data/org.qtproject.example.clicker/
                                          if reading/writing to that folder isn't possible (without root), I would put it to:
                                          /sdcard/Android/data/org.qtproject.example.clicker/

                                          J.HilkJ Offline
                                          J.HilkJ Offline
                                          J.Hilk
                                          Moderators
                                          wrote on last edited by
                                          #21

                                          @Sucharek

                                          I actually have a ini file that I ship in one of my applications with the resource system. On startup I check, if my ini file exists in the relating appdata system.
                                          If not I copy it from the resources.

                                          This is made for Windows, but since its Qt, it should work just as well for Android.

                                          Here are the bare bone functions:

                                          //From to create class PreAppTasks:
                                          void PreAppTasks::copyIniToDestDir()
                                          {
                                              QFile *destFile = getDestIniFile();
                                              //QFile *orgFile  = getOrgIniFile();
                                              //in your case simply:
                                              QFile *orgFile = new File(":/config/config.ini");
                                          
                                              if(orgFile){
                                                  if(destFile && destFile->exists()){
                                                      //Both Files exists: implement your logic, for this case here
                                                  } else {
                                                      //DestFile does not exist (propably the first program execution) -> simply copy from install folder
                                                      //But first, create the folder, if it does not exist
                                                      QFileInfo info(destFile->fileName());
                                                      info.setFile(info.absolutePath());
                                                      if(!info.exists()){
                                                          QDir d;
                                                          d.mkpath(info.absoluteFilePath());
                                                      }
                                                      orgFile->copy(destFile->fileName());
                                                  }
                                              }
                                          
                                              if(destFile){
                                                  destFile->deleteLater();
                                                  destFile = nullptr;
                                              }
                                              if(orgFile){
                                                  orgFile->deleteLater();
                                                  orgFile = nullptr;
                                              }
                                          }
                                          
                                          
                                          QFile *PreAppTasks::getDestIniFile()
                                          {
                                          //in your case:
                                              return new QFile(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/config/config.ini"));
                                          }
                                          
                                          //In main.cpp (AFTER application instance creation!)
                                          int main(int argc, char *argv[])
                                          {
                                              QGuiApplication a(argc, argv);
                                              PreAppTasks::copyIniToDestDir();
                                          ....
                                              return a.exec();
                                          }
                                          

                                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                          Q: What's that?
                                          A: It's blue light.
                                          Q: What does it do?
                                          A: It turns blue.

                                          S 1 Reply Last reply
                                          6

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved