Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. How to pass enum class to QML?
QtWS25 Last Chance

How to pass enum class to QML?

Scheduled Pinned Locked Moved Solved QML and Qt Quick
qmlenum classenums
4 Posts 2 Posters 4.0k 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.
  • someoneintheboxS Offline
    someoneintheboxS Offline
    someoneinthebox
    wrote on last edited by
    #1

    Hello everyone!

    I am on learning to QML with Qt and get some trouble with passing enum class to qml.

    When I use signal with int parameters - it's all right and code work perfectly.

    But, and here the trouble, if I use signal with some enum class parameters I have undefined values in qml signal handler. I tried to register enum class through qmlRegisterType but it's not working. I will be grateful for the help.

    Here the code:

    Some Helper class

    class Helper : public QObject
    {
        Q_OBJECT
        Q_ENUMS(Requester)
        Q_ENUMS(JANSWER)
    
    public:
    
    enum class Requester {
        ReqLogin,
        ReqNull,
        ReqSave,
        ReqError,
        ReqUnknown
    };
    
    enum class JANSWER {
        OK,
        Complete,
        Error,
        Unknown
    };
    
    };
    

    main.cpp

    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        qmlRegisterType<JsonPackWorker>("com.jsonpackworker", 1, 0, "JsonPackWorker");
        qmlRegisterType<Helper>("com.Helper", 1, 0, "Helper");
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
        return app.exec();
    }
    

    JsonPackWorker.h

    class JsonPackWorker : public QObject
    {
        Q_OBJECT
    public:
        <...>
    
    signals:    
        <...>
        void sendAnswer(Helper::Requester req, Helper::JANSWER answer);
    
    public slots:
        <...>
    };
    

    Somewehere in JsonPackWorker.cpp

    emit sendAnswer(Helper::Requester::ReqNull, Helper::JANSWER::OK);
    

    main.qml

    <...>
    import com.jsonpackworker 1.0
    import com.Helper 1.0
    
    ApplicationWindow {
        id: mainWindow
    
        // Requests in answers
        property int reqLogin: Helper.ReqLogin
    
        <...>
    
        JsonPackWorker {
            id: packWorker
            <...>
            onSendAnswer: {
                // Here I've got undefined undefined if there enum class parameters
                console.log(req + " " + answer)
                switch(req) {
                case reqLogin: loginDial.checkLogin(answer)
                    break;
                default:
                }
            }
        }
    
    }
    

    Mom said I am special.

    p3c0P 1 Reply Last reply
    0
    • someoneintheboxS someoneinthebox

      Hello everyone!

      I am on learning to QML with Qt and get some trouble with passing enum class to qml.

      When I use signal with int parameters - it's all right and code work perfectly.

      But, and here the trouble, if I use signal with some enum class parameters I have undefined values in qml signal handler. I tried to register enum class through qmlRegisterType but it's not working. I will be grateful for the help.

      Here the code:

      Some Helper class

      class Helper : public QObject
      {
          Q_OBJECT
          Q_ENUMS(Requester)
          Q_ENUMS(JANSWER)
      
      public:
      
      enum class Requester {
          ReqLogin,
          ReqNull,
          ReqSave,
          ReqError,
          ReqUnknown
      };
      
      enum class JANSWER {
          OK,
          Complete,
          Error,
          Unknown
      };
      
      };
      

      main.cpp

      int main(int argc, char *argv[])
      {
          QGuiApplication app(argc, argv);
      
          qmlRegisterType<JsonPackWorker>("com.jsonpackworker", 1, 0, "JsonPackWorker");
          qmlRegisterType<Helper>("com.Helper", 1, 0, "Helper");
      
          QQmlApplicationEngine engine;
          engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
      
          return app.exec();
      }
      

      JsonPackWorker.h

      class JsonPackWorker : public QObject
      {
          Q_OBJECT
      public:
          <...>
      
      signals:    
          <...>
          void sendAnswer(Helper::Requester req, Helper::JANSWER answer);
      
      public slots:
          <...>
      };
      

      Somewehere in JsonPackWorker.cpp

      emit sendAnswer(Helper::Requester::ReqNull, Helper::JANSWER::OK);
      

      main.qml

      <...>
      import com.jsonpackworker 1.0
      import com.Helper 1.0
      
      ApplicationWindow {
          id: mainWindow
      
          // Requests in answers
          property int reqLogin: Helper.ReqLogin
      
          <...>
      
          JsonPackWorker {
              id: packWorker
              <...>
              onSendAnswer: {
                  // Here I've got undefined undefined if there enum class parameters
                  console.log(req + " " + answer)
                  switch(req) {
                  case reqLogin: loginDial.checkLogin(answer)
                      break;
                  default:
                  }
              }
          }
      
      }
      
      p3c0P Offline
      p3c0P Offline
      p3c0
      Moderators
      wrote on last edited by
      #2

      Hi @someoneinthebox and Welcome,

      Apart from the rest you also need to declare both the enums as Q_DECLARE_METATYPE.
      So inside Helper:

      class Helper {
         ...
      };
      Q_DECLARE_METATYPE(Helper::Requester)
      Q_DECLARE_METATYPE(Helper::JANSWER)
      

      157

      someoneintheboxS 1 Reply Last reply
      1
      • p3c0P p3c0

        Hi @someoneinthebox and Welcome,

        Apart from the rest you also need to declare both the enums as Q_DECLARE_METATYPE.
        So inside Helper:

        class Helper {
           ...
        };
        Q_DECLARE_METATYPE(Helper::Requester)
        Q_DECLARE_METATYPE(Helper::JANSWER)
        
        someoneintheboxS Offline
        someoneintheboxS Offline
        someoneinthebox
        wrote on last edited by
        #3

        @p3c0, thank you so much! It works now!

        Mom said I am special.

        p3c0P 1 Reply Last reply
        0
        • someoneintheboxS someoneinthebox

          @p3c0, thank you so much! It works now!

          p3c0P Offline
          p3c0P Offline
          p3c0
          Moderators
          wrote on last edited by
          #4

          @someoneinthebox You're Welcome :)
          Btw. if you are using Qt 5.5 or greater then use Q_ENUM instead as Q_ENUMS are deprecated.

          157

          1 Reply Last reply
          1

          • Login

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