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