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. Wrong enum value from QSettings using Qt 6
Forum Updated to NodeBB v4.3 + New Features

Wrong enum value from QSettings using Qt 6

Scheduled Pinned Locked Moved Solved General and Desktop
21 Posts 6 Posters 4.7k Views
  • 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.
  • Cobra91151C Offline
    Cobra91151C Offline
    Cobra91151
    wrote on last edited by Cobra91151
    #11

    I think that I need to use something like this in my program.

    #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
        int wlanState = ManageProgram::loadSettings("AppSettings", "WlanState", Connection::State::Unknown).toInt();
        wlanConnectionState = static_cast<Connection::State>(wlanState);
    #else
        wlanConnectionState = ManageProgram::loadSettings("AppSettings", "WlanState", Connection::State::Unknown).value<Connection::State>();
    #endif
    

    The output for both cases: wlanConnectionState: 2

    I should use the .value<Connection::State>(); in Qt 5 as always. And use .toInt() and then cast the result to the enum in Qt 6 until QVariant conversion problem is fixed.

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #12

      Works fine for me with Qt6.head + MSVC

      namespace Connection {
          enum State {
              NotConnected = 0,
              Connecting = 1,
              Connected = 2,
              Canceled = 3,
              Unknown = 4
          };
      }
      Q_DECLARE_METATYPE(Connection::State);  // not even needed for the testcase
      
      int main(int argc, char* argv[])
      {
          QCoreApplication app(argc, argv);
          QVariant v(2);
          Connection::State s = v.value<Connection::State>();
          if (s == Connection::Connected) 
              qDebug() << "Connected";
          else 
              qDebug() << "Not connected";
      }
      

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      Cobra91151C 2 Replies Last reply
      1
      • Christian EhrlicherC Christian Ehrlicher

        Works fine for me with Qt6.head + MSVC

        namespace Connection {
            enum State {
                NotConnected = 0,
                Connecting = 1,
                Connected = 2,
                Canceled = 3,
                Unknown = 4
            };
        }
        Q_DECLARE_METATYPE(Connection::State);  // not even needed for the testcase
        
        int main(int argc, char* argv[])
        {
            QCoreApplication app(argc, argv);
            QVariant v(2);
            Connection::State s = v.value<Connection::State>();
            if (s == Connection::Connected) 
                qDebug() << "Connected";
            else 
                qDebug() << "Not connected";
        }
        
        Cobra91151C Offline
        Cobra91151C Offline
        Cobra91151
        wrote on last edited by Cobra91151
        #13

        @Christian-Ehrlicher

        Yes, it works. So, the enum must be overwritten somewhere in my program which changes the value to 0.
        I will check it and fix it. Thank you very much for checking it.

        1 Reply Last reply
        1
        • Christian EhrlicherC Christian Ehrlicher

          Works fine for me with Qt6.head + MSVC

          namespace Connection {
              enum State {
                  NotConnected = 0,
                  Connecting = 1,
                  Connected = 2,
                  Canceled = 3,
                  Unknown = 4
              };
          }
          Q_DECLARE_METATYPE(Connection::State);  // not even needed for the testcase
          
          int main(int argc, char* argv[])
          {
              QCoreApplication app(argc, argv);
              QVariant v(2);
              Connection::State s = v.value<Connection::State>();
              if (s == Connection::Connected) 
                  qDebug() << "Connected";
              else 
                  qDebug() << "Not connected";
          }
          
          Cobra91151C Offline
          Cobra91151C Offline
          Cobra91151
          wrote on last edited by Cobra91151
          #14

          @Christian-Ehrlicher
          @JonB
          @J-Hilk

          I have commented all wlanConnectionState code in my program where it could be overwritten, recompiled it (clean/run qmake/build) but it still returns as 0. So, I have used @Christian-Ehrlicher example and added my code there.

          #include <QCoreApplication>
          #include <QVariant>
          #include <QSettings>
          #include <QDir>
          #include <QRegularExpression>
          
          #define APP_NAME "ConsoleApp"
          #define APP_SETTINGS_PATH QDir::toNativeSeparators(QString("%1/settings/%2.ini").arg(QCoreApplication::applicationDirPath(), QString(APP_NAME).remove(QRegularExpression("\\s"))))
          
          namespace Connection {
              enum State {
                  NotConnected = 0,
                  Connecting = 1,
                  Connected = 2,
                  Canceled = 3,
                  Unknown = 4
              };
          }
          
          Q_DECLARE_METATYPE(Connection::State);  // not even needed for the testcase
          QVariant loadSettings(QString group, QString property, QVariant defaultValue);
          
          int main(int argc, char* argv[])
          {
              QCoreApplication app(argc, argv);
              //QVariant v(2);
              Connection::State s = loadSettings("AppSettings", "WlanState", Connection::State::Unknown).value<Connection::State>();
          
              //int wlanState = loadSettings("AppSettings", "WlanState", Connection::State::Unknown).toInt();
              //Connection::State s = static_cast<Connection::State>(wlanState);
          
              if (s == Connection::Connected) {
                  qDebug() << "Connected";
              } else {
                  qDebug() << "Not connected";
              }
          
              qDebug() << "s: " << s;
          }
          
          QVariant loadSettings(QString group, QString property, QVariant defaultValue)
          {
              QSettings appSettings(APP_SETTINGS_PATH, QSettings::IniFormat);
              appSettings.beginGroup(group);
              QVariant valueVariant = appSettings.value(property, defaultValue);
              appSettings.endGroup();
              return valueVariant;
          }
          

          It also returns:

          Not connected
          s:  0
          

          When I use this code:

          int wlanState = loadSettings("AppSettings", "WlanState", Connection::State::Unknown).toInt();
          Connection::State s = static_cast<Connection::State>(wlanState);
          

          The output is the following:

          Connected
          s:  2
          

          So, it seems that issue with QVariant conversion still exists.
          Can you confirm (reproduce) it using updated code? Also, you will need the settings directory with .ini file: https://mega.nz/file/EVRwWI5b#4MXbcgqE1aCm_YKEk0leZnMnEGMWw1yuLHL61UlIi54

          Or create one called ConsoleApp.ini with the following content:

          [AppSettings]
          WlanState=2
          

          Thank you.

          1 Reply Last reply
          0
          • JoeCFDJ Offline
            JoeCFDJ Offline
            JoeCFD
            wrote on last edited by
            #15

            @Cobra91151 said in Wrong enum value from QSettings using Qt 6:

            namespace Connection {
            enum State {
            NotConnected = 0,
            Connecting = 1,
            Connected = 2,
            Canceled = 3,
            Unknown = 4
            };
            }

            why not use enum class?

            namespace Connection {
                enum class State {
                    NotConnected = 0,
                    Connecting = 1,
                    Connected = 2,
                    Canceled = 3,
                    Unknown = 4
                };
            }
            
            Cobra91151C 1 Reply Last reply
            0
            • JoeCFDJ JoeCFD

              @Cobra91151 said in Wrong enum value from QSettings using Qt 6:

              namespace Connection {
              enum State {
              NotConnected = 0,
              Connecting = 1,
              Connected = 2,
              Canceled = 3,
              Unknown = 4
              };
              }

              why not use enum class?

              namespace Connection {
                  enum class State {
                      NotConnected = 0,
                      Connecting = 1,
                      Connected = 2,
                      Canceled = 3,
                      Unknown = 4
                  };
              }
              
              Cobra91151C Offline
              Cobra91151C Offline
              Cobra91151
              wrote on last edited by
              #16

              @JoeCFD

              Hello!

              I do not think it will work in my case, since I need to store enum value as integer in the .ini file and get it later as enum. On Qt 5 it works as expected. So, I think there is an issue with enum convertion in Qt 6. You can try out my example above to see what the issue is.
              Anyway, thank you for your reply :)

              1 Reply Last reply
              0
              • Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by Christian Ehrlicher
                #17

                Ok, looks like an enum now need Q_ENUM() (even though I think it may be a subtle bug):

                struct Connection {
                    Q_GADGET
                public:
                        enum State {
                        NotConnected = 0,
                        Connecting = 1,
                        Connected = 2,
                        Canceled = 3,
                        Unknown = 4
                    };
                    Q_ENUM(State)
                };
                

                This also allows this in your ini file:

                [AppSettings]
                WlanState=Connected
                

                Will investigate it later on

                // see https://bugreports.qt.io/browse/QTBUG-109744

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                J.HilkJ 1 Reply Last reply
                3
                • H Offline
                  H Offline
                  henrycavill23
                  Banned
                  wrote on last edited by
                  #18
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • Christian EhrlicherC Christian Ehrlicher

                    Ok, looks like an enum now need Q_ENUM() (even though I think it may be a subtle bug):

                    struct Connection {
                        Q_GADGET
                    public:
                            enum State {
                            NotConnected = 0,
                            Connecting = 1,
                            Connected = 2,
                            Canceled = 3,
                            Unknown = 4
                        };
                        Q_ENUM(State)
                    };
                    

                    This also allows this in your ini file:

                    [AppSettings]
                    WlanState=Connected
                    

                    Will investigate it later on

                    // see https://bugreports.qt.io/browse/QTBUG-109744

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

                    @Christian-Ehrlicher

                    @J-Hilk said in Wrong enum value from QSettings using Qt 6:

                    @Cobra91151 did you also use Q_ENUM_NS or Q_ENUM if your declaration is inside a QObject class?

                    cough 🤓

                    might be in it since the beginning of Qt6 ? because I don't remember it ever working without the Q_ENUM macro?


                    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.

                    Cobra91151C Christian EhrlicherC 2 Replies Last reply
                    0
                    • J.HilkJ J.Hilk

                      @Christian-Ehrlicher

                      @J-Hilk said in Wrong enum value from QSettings using Qt 6:

                      @Cobra91151 did you also use Q_ENUM_NS or Q_ENUM if your declaration is inside a QObject class?

                      cough 🤓

                      might be in it since the beginning of Qt6 ? because I don't remember it ever working without the Q_ENUM macro?

                      Cobra91151C Offline
                      Cobra91151C Offline
                      Cobra91151
                      wrote on last edited by
                      #20

                      @Christian-Ehrlicher @J-Hilk

                      I see this bug is fixed in Qt 6.5.0 & Qt 6.6.0. The issue is resolved.
                      Thank you.

                      1 Reply Last reply
                      1
                      • Cobra91151C Cobra91151 has marked this topic as solved on
                      • J.HilkJ J.Hilk

                        @Christian-Ehrlicher

                        @J-Hilk said in Wrong enum value from QSettings using Qt 6:

                        @Cobra91151 did you also use Q_ENUM_NS or Q_ENUM if your declaration is inside a QObject class?

                        cough 🤓

                        might be in it since the beginning of Qt6 ? because I don't remember it ever working without the Q_ENUM macro?

                        Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #21

                        @J-Hilk said in Wrong enum value from QSettings using Qt 6:

                        because I don't remember it ever working without the Q_ENUM macro?

                        It worked in Qt5 so it's a Qt6 regression. And it is very surprising because QVariant<int>() properly converts to an enum whereas QVariant<QString>() did not.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        0
                        • JonBJ JonB referenced this topic on

                        • Login

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