Search code examples
c++qtqmlqtquick2

How to access C++ enum from QML?


class StyleClass : public QObject {
public:
    typedef enum
        {
            STYLE_RADIAL,
            STYLE_ENVELOPE,
            STYLE_FILLED
        }  Style;

    Style m_style;
    //...
};

The .h file has the above code. How to access the above enum through QML?


Solution

  • You can wrap the enum in a class which derives from QObject (and that you expose to QML):

    style.hpp :

    #ifndef STYLE_HPP
    #define STYLE_HPP
    
    #include <QtGlobal>
    #if QT_VERSION < QT_VERSION_CHECK(5,0,0)
        // Qt 4
        #include <QDeclarativeEngine>
    #else
        // Qt 5
        #include <QQmlEngine>
    #endif
    
    // Required derivation from QObject
    class StyleClass : public QObject
    {
        Q_OBJECT
    
        public:
            // Default constructor, required for classes you expose to QML.
            StyleClass() : QObject() {}
    
            enum EnStyle
            {
                STYLE_RADIAL,
                STYLE_ENVELOPE,
                STYLE_FILLED
            };
            Q_ENUMS(EnStyle)
    
            // Do not forget to declare your class to the QML system.
            static void declareQML() {
                qmlRegisterType<StyleClass>("MyQMLEnums", 13, 37, "Style");
            }
    };
    
    #endif    // STYLE_HPP
    

    main.cpp:

    #include <QApplication>
    #include "style.hpp"
    
    int main (int argc, char ** argv) {
        QApplication a(argc, argv);
    
        //...
    
        StyleClass::declareQML();
    
        //...
    
        return a.exec();
    }
    

    QML Code:

    import MyQMLEnums 13.37
    import QtQuick 2.0    // Or 1.1 depending on your Qt version
    
    Item {
        id: myitem
    
        //...
    
        property int item_style: Style.STYLE_RADIAL
    
        //...
    }