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




qt qml (4)

अतिरिक्त जानकारी ( क्यूटी 5.5 से पहले दस्तावेज नहीं):

आपके एनम मूल्य नाम पूंजी पत्र से शुरू होना चाहिए

यह काम करेगा:

enum EnStyle
{
    STYLE_RADIAL,
    STYLE_ENVELOPE,
    STYLE_FILLED
};
Q_ENUMS(EnStyle)

यह नहीं करता:

enum EnStyle
{
    styleRADIAL,
    styleENVELOPE,
    styleFILLED
};
Q_ENUMS(EnStyle)

संकलन समय पर आपको किसी प्रकार की त्रुटि नहीं मिलेगी, उन्हें केवल क्यूएमएल इंजन द्वारा अनदेखा किया जाता है।

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

    //...
}

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

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


क्यूटी 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







qtquick2