c++ क्यूएमएल से सी++ एनम तक कैसे पहुंचे?




qt qml (4)

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

    Style m_style;
    //...
};

.H फ़ाइल में उपरोक्त कोड है। QML के माध्यम से उपरोक्त enum तक कैसे पहुंचे?


आप एनओम को कक्षा में लपेट सकते हैं जो QObject से प्राप्त होता है (और आप 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();
}

क्यूएमएल कोड:

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

    //...
}

क्यूटी 5.8 के रूप में आप namespace से enums का पर्दाफाश कर सकते हैं:

नामस्थान और 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
}

एक Qml व्यू / संदर्भ बनाने से पहले नामस्थान (उदाहरण के लिए मुख्य () में पंजीकृत करें):

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
);

इसे एक क्यूएमएल फ़ाइल में प्रयोग करें:

import QtQuick 2.0
import my.namespace 1.0

Item {
    Component.onCompleted: console.log(MyNamespace.STYLE_RADIAL)
}

संदर्भ:

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


docs में वर्णित अनुसार Q_ENUMS मैक्रो का उपयोग करके अपने enum के बारे में जागरूक बनाओ। docs में वर्णित अनुसार, आपको उस वर्ग को पंजीकृत करना होगा जो एनम का उपयोग करता है।

आशिफ का उद्धरण ब्लॉक केवल तभी वैध है जब enum वैश्विक है या गैर- QObject व्युत्पन्न वर्ग के स्वामित्व में है।


क्यूटी क्यूटी संस्करण 5.10 के बाद से क्यूएमएल-परिभाषित एनम प्रकारों का भी समर्थन करता है। एयर-डेक्स द्वारा सी ++ - आधारित उत्तर के विकल्प के रूप में, अब आप एनम प्रकार बनाने के लिए क्यूएमएल का भी उपयोग कर सकते हैं:

Style.qml:

import QtQuick 2.0

QtObject {
  enum EnStyle {
    STYLE_RADIAL,
    STYLE_ENVELOPE,
    STYLE_FILLED
  }
}

यदि आप केवल अपने क्यूएमएल कोड में enums का उपयोग करना चाहते हैं, तो यह समाधान बहुत आसान है। आप उपरोक्त enum को शैली प्रकार के साथ qml में तब तक एक्सेस कर सकते हैं, उदाहरण के लिए:

import VPlayApps 1.0
import QtQuick 2.9

App {

  property int enStyle: Style.EnStyle.STYLE_RADIAL

  Component.onCompleted: {
    if(enStyle === Style.EnStyle.STYLE_ENVELOPE)
      console.log("ENVELOPE")
    else
      console.log("NOT ENVELOPE")
  }
}

QML- आधारित enum प्रकार के किसी अन्य उपयोग उदाहरण के लिए here देखें।





qtquick2