Registration of custom enum in QML

In order to use enum enum enumerations in Q ++, you need to create a class inherited from QObject and register it as a QML Type before running the QML engine in the application.

To learn, create a project using QtQuick.

The minimum version of this class with enumerations will be as follows:

Info.h

#ifndef INFO_H
#define INFO_H
 
#include <QObject>
 
class Info : public QObject
{
    Q_OBJECT
public:
    enum State {
        Information,
        Debug,
        Warning,
        Error
    };
    Q_ENUM(State)
};
 
#endif // INFO_H

Next, you need to register this class as a QML Type in the main function. This requires a QtQml header file and a qmlRegisterType function.

Main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml> // Include QtQml to use qmlRegisterType
 
#include "info.h" // Connect the header file of the Info class
 
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
 
    qmlRegisterType<Info>("info", 1, 0, "Info"); // Register this class as a module
 
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
 
    return app.exec();
}

After that it will only be necessary to connect the new QML module in the main.qml file and use the enumerations to display the text. We will output the message β€œMessage 0”, β€œMessage 1”, etc. The numbers will be taken from the enumerations.

Main.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
 
import info 1.0  // Import Module
 
Window {
    visible: true
    width: 360
    height: 360
    title: qsTr("Enumeration")
 
    ListView {
        anchors.fill: parent
        delegate: Item {
            height: 48
            width: parent.width
            Text {
                anchors.fill: parent
                text: "Message " + model.text
 
                verticalAlignment: Text.AlignVCenter
                horizontalAlignment: Text.AlignHCenter
            }
        }
 
        model: ListModel {
            // Use the enumerations from C ++
            ListElement {text: Info.Information}
            ListElement {text: Info.Debug}
            ListElement {text: Info.Warning}
            ListElement {text: Info.Error}
        }
    }
}

Appearance of the application will be as follows:

Last updated