Evgenii Legotckoi
1 июля 2017 г. 16:03

QML - Урок 028. Регистрация пользовательских enum в QML

Для того, чтобы использовать в QML перечисления enum, прописанные в C++, необходимо создать класс, наследованный от QObject, и зарегистрировать его в качестве QML Type перед запуском QML движка  в приложении.

Для изучения создайте проект с использованием QtQuick.

Минимальный вариант такого класса с перечислениям будет следующим:

  1. #ifndef INFO_H
  2. #define INFO_H
  3.  
  4. #include <QObject>
  5.  
  6. class Info : public QObject
  7. {
  8. Q_OBJECT
  9. public:
  10. enum State {
  11. Information,
  12. Debug,
  13. Warning,
  14. Error
  15. };
  16. Q_ENUM(State)
  17. };
  18.  
  19. #endif // INFO_H

Далее необходимо зарегистрировать этот класс в качестве QML Type в функции main. Для этого понадобится заголовочный файл QtQml и функция qmlRegisterType.

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QtQml> // Подключить QtQml для использования qmlRegisterType
  4.  
  5. #include "info.h" // Подключить заголовочный файл класса Info
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. QGuiApplication app(argc, argv);
  10.  
  11. qmlRegisterType<Info>("info", 1, 0, "Info"); // Зарегистрировать данный класс в качестве модуля
  12.  
  13. QQmlApplicationEngine engine;
  14. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  15. if (engine.rootObjects().isEmpty())
  16. return -1;
  17.  
  18. return app.exec();
  19. }

После чего останется только подключить новый QML модуль в файле main.qml и воспользоваться перечислениями для отображения текста. Будем выводить сообщение "Message 0", "Message 1" и т.д. Числа будут взяты из перечислений.

  1. import QtQuick 2.5
  2. import QtQuick.Window 2.2
  3. import QtQuick.Controls 1.4
  4.  
  5. import info 1.0 // Подключить модуль
  6.  
  7. Window {
  8. visible: true
  9. width: 360
  10. height: 360
  11. title: qsTr("Enumeration")
  12.  
  13. ListView {
  14. anchors.fill: parent
  15. delegate: Item {
  16. height: 48
  17. width: parent.width
  18. Text {
  19. anchors.fill: parent
  20. text: "Message " + model.text
  21.  
  22. verticalAlignment: Text.AlignVCenter
  23. horizontalAlignment: Text.AlignHCenter
  24. }
  25. }
  26.  
  27. model: ListModel {
  28. // Воспользоваться перечислениями из C++
  29. ListElement {text: Info.Information}
  30. ListElement {text: Info.Debug}
  31. ListElement {text: Info.Warning}
  32. ListElement {text: Info.Error}
  33. }
  34. }
  35. }

Внешний вид приложения будет следующим:

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь