How to access C++ enum from QML?

后端 未结 7 542
清歌不尽
清歌不尽 2020-12-04 18:03
class StyleClass : public QObject {
public:
    typedef enum
        {
            STYLE_RADIAL,
            STYLE_ENVELOPE,
            STYLE_FILLED
        }  Styl         


        
相关标签:
7条回答
  • 2020-12-04 18:40

    As of Qt 5.8 you can expose enums from a namespace:

    Define the namespace and enum:

    #include <QObject>
    
    namespace MyNamespace
    {
        Q_NAMESPACE         // required for meta object creation
        enum EnStyle {
            STYLE_RADIAL,
            STYLE_ENVELOPE,
            STYLE_FILLED
        };
        Q_ENUM_NS(EnStyle)  // register the enum in meta object data
    }
    

    Register the namespace (eg. in main(), before creating a Qml View/Context):

    qmlRegisterUncreatableMetaObject(
      MyNamespace::staticMetaObject, // static meta object
      "my.namespace",                // import statement (can be any string)
      1, 0,                          // major and minor version of the import
      "MyNamespace",                 // name in QML (does not have to match C++ name)
      "Error: only enums"            // error in case someone tries to create a MyNamespace object
    );
    

    Use it in a QML file:

    import QtQuick 2.0
    import my.namespace 1.0
    
    Item {
        Component.onCompleted: console.log(MyNamespace.STYLE_RADIAL)
    }
    

    References:

    https://www.kdab.com/new-qt-5-8-meta-object-support-namespaces/

    http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterUncreatableMetaObject

    http://doc.qt.io/qt-5/qobject.html#Q_ENUM_NS

    0 讨论(0)
提交回复
热议问题