qtquick application c++ qt qml qtquick2

c++ - application - qt5



¿Cómo acceder a C++ enum desde QML? (5)

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

El archivo .h tiene el código anterior. ¿Cómo acceder a la enumeración anterior a través de QML?


Haga que el moc conozca su enumeración utilizando la macro Q_ENUMS , como se describe en los docs . Debe registrar la clase que ''posee'' la enumeración antes de usarla, como se describe en los docs .

El bloque de cita de Ashif solo es válido si la enumeración es global o pertenece a una clase no derivada de QObject .


Información adicional (no documentada antes de Qt 5.5 ):

Sus nombres de valores enum deben comenzar con una Mayúscula.

Esto funcionará:

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

Esto no lo hace:

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

No obtendrá ningún tipo de error en tiempo de compilación, el motor QML simplemente lo ignorará.


Puede envolver la enumeración en una clase que se deriva de QObject (y que expone a 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(); }

Código QML:

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 //... }


Qt también admite tipos de enum definidos por QML desde Qt versión 5.10. Como alternativa a la respuesta basada en C ++ de air-dex, ahora también puede usar QML para crear tipos enum:

Style.qml:

import QtQuick 2.0 QtObject { enum EnStyle { STYLE_RADIAL, STYLE_ENVELOPE, STYLE_FILLED } }

Si solo tiene la intención de utilizar las enumeraciones en su código QML, esta solución es mucho más simple. Puede acceder a la enumeración anterior con el tipo de Estilo en qml, por ejemplo:

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") } }

Vea here otro ejemplo de uso de un tipo de enumeración basado en QML.


A partir de Qt 5.8 puedes exponer enumeraciones desde un namespace :

Defina el espacio de nombres y la enumeración:

#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 }

Registre el espacio de nombres (por ejemplo, en main (), antes de crear una vista / contexto 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 );

Úselo en un archivo QML:

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

Referencias

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