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 Cobra91151

    @JonB

    No, it's my custom enum.

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

    Yes, it works only when converting using toInt() method.

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

    wlanConnectionState: 2

    Why it fails to convert to enum: wlanConnectionState = ManageProgram::loadSettings("AppSettings", "WlanState", Connection::State::Unknown).value<Connection::State>();? That's the question.

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

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

    Why it fails to convert to enum

    @J-Hilk

    are you sure the Enum is correctly registered with the meta system ?

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

    Cobra91151C 1 Reply Last reply
    1
    • Christian EhrlicherC Christian Ehrlicher

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

      Why it fails to convert to enum

      @J-Hilk

      are you sure the Enum is correctly registered with the meta system ?

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

      @J-Hilk
      @Christian-Ehrlicher
      @JonB

      I think, it is already registered: Q_DECLARE_METATYPE(Connection::State).
      Or Qt 6 uses different method of registering types?

      J.HilkJ 1 Reply Last reply
      0
      • Cobra91151C Cobra91151

        @J-Hilk
        @Christian-Ehrlicher
        @JonB

        I think, it is already registered: Q_DECLARE_METATYPE(Connection::State).
        Or Qt 6 uses different method of registering types?

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

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


        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.

        1 Reply Last reply
        0
        • Cobra91151C Offline
          Cobra91151C Offline
          Cobra91151
          wrote on last edited by
          #10

          @J-Hilk

          This enum declaration is in constants.h (header file). I use it as a helper file to create some enums/structs/defines there and use it in my program. There is no class in this file.
          So, it's outside of a QObject class.

          1 Reply Last reply
          0
          • 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