Evgenii Legotckoi
5 июля 2017 г. 17:14

QML - Урок 030. Регистрация QML Типа в качестве Синглетон объекта

Помимо C++ классов в QML в качестве Синглетона можно использовать и QML типы, которые представляют собой отдельные файлы QML.

Для этого также используется qmlRegisterSingletonType , но чтобы этот тип работал в качестве Singleton объекта, необходимо прописать в самом QML файле pragma Singleton.

Давайте сделаем небольшое приложение, которое будет выводить также несколько сообщения, при этом сообщения будут забираться через метод Singleton QML Типа.


Структура проекта

  • SingletonQML.pro - профайл проекта
  • main.cpp - файл с main функцией
  • main.qml - main файл QML
  • Util.qml - синглетон QML

Профайл проект будет создан по умолчанию и не будет изменяться.

main.cpp

В качестве Синглетон объекта используем файл Util.qml . Чтобы он стал Синглетоном, его необходимо зарегистрировать с помощью qmlRegisterSingletonType, а также указать в нём директиву pragma Singleton. Для начала произведём его регистрацию.

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

Util.qml

В этом файле обязательно укажите директиву pragma Singleton.

  1. pragma Singleton // Указываем, что этот QML Тип является синглетоном
  2. import QtQuick 2.0
  3.  
  4. Item {
  5. function getMessage(messageNumber)
  6. {
  7. switch(messageNumber)
  8. {
  9. case 1:
  10. return "First Message"
  11. case 2:
  12. return "Second Message"
  13. case 3:
  14. return "Third Message"
  15. default:
  16. return "Nothing found"
  17. }
  18. }
  19. }

main.qml

А теперь используем синглетон объект, чтобы выводить текст с помощью этой функции.

  1. import QtQuick 2.5
  2. import QtQuick.Window 2.2
  3. import QtQuick.Controls 1.4
  4.  
  5. import Util 1.0 // Таким образом производится импорт QML синглетона
  6.  
  7.  
  8. Window {
  9. visible: true
  10. width: 640
  11. height: 480
  12. title: qsTr("Singleton Class")
  13.  
  14. ListView {
  15. anchors.fill: parent
  16. delegate: Item {
  17. height: 48
  18. width: parent.width
  19. Text {
  20. anchors.fill: parent
  21. text: model.text
  22.  
  23. verticalAlignment: Text.AlignVCenter
  24. horizontalAlignment: Text.AlignHCenter
  25. }
  26. }
  27.  
  28. model: listModel
  29. }
  30.  
  31. ListModel {
  32. id: listModel
  33.  
  34. Component.onCompleted: {
  35. // Обращение к методу синглетона выглядит, как обращение к статическому методу
  36. listModel.append({'text': Util.getMessage(1)})
  37. listModel.append({'text': Util.getMessage(2)})
  38. listModel.append({'text': Util.getMessage(3)})
  39. listModel.append({'text': Util.getMessage(4)})
  40. }
  41. }
  42. }

Итог

Таким образом можно использовать синглетон объекты QML для эмуляции использования статических методов, причём это правильный подход для работы с подобным функционалом.

Скачать архив с проектом

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

Комментарии

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