Для того, чтобы использовать в QML перечисления enum, прописанные в C++, необходимо создать класс, наследованный от QObject, и зарегистрировать его в качестве QML Type перед запуском QML движка в приложении.
Для изучения создайте проект с использованием QtQuick.
Минимальный вариант такого класса с перечислениям будет следующим:
- #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
Далее необходимо зарегистрировать этот класс в качестве QML Type в функции main. Для этого понадобится заголовочный файл QtQml и функция qmlRegisterType.
- #include <QGuiApplication>
- #include <QQmlApplicationEngine>
- #include <QtQml> // Подключить QtQml для использования qmlRegisterType
- #include "info.h" // Подключить заголовочный файл класса Info
- int main(int argc, char *argv[])
- {
- QGuiApplication app(argc, argv);
- qmlRegisterType<Info>("info", 1, 0, "Info"); // Зарегистрировать данный класс в качестве модуля
- QQmlApplicationEngine engine;
- engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
- if (engine.rootObjects().isEmpty())
- return -1;
- return app.exec();
- }
После чего останется только подключить новый QML модуль в файле main.qml и воспользоваться перечислениями для отображения текста. Будем выводить сообщение "Message 0", "Message 1" и т.д. Числа будут взяты из перечислений.
- import QtQuick 2.5
- import QtQuick.Window 2.2
- import QtQuick.Controls 1.4
- import info 1.0 // Подключить модуль
- 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 {
- // Воспользоваться перечислениями из C++
- ListElement {text: Info.Information}
- ListElement {text: Info.Debug}
- ListElement {text: Info.Warning}
- ListElement {text: Info.Error}
- }
- }
- }
Внешний вид приложения будет следующим: