- 1. Структура проекту
- 2. main.cpp
- 3. Util.qml
- 4. main.qml
- 5. Підсумок
Крім 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. Для початку здійснимо його реєстрацію.
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQml> // Подключаем для использования функции qmlRegisterSingletonType int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // Регистрируем qml файл через указание его пути. qmlRegisterSingletonType(QUrl("qrc:/Util.qml"), "Util", 1, 0, "Util"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
Util.qml
У цьому файлі обов'язково вкажіть директиву pragma Singleton.
pragma Singleton // Указываем, что этот QML Тип является синглетоном import QtQuick 2.0 Item { function getMessage(messageNumber) { switch(messageNumber) { case 1: return "First Message" case 2: return "Second Message" case 3: return "Third Message" default: return "Nothing found" } } }
main.qml
А тепер використовуємо синглетон об'єкт, щоб виводити текст за допомогою цієї функції.
import QtQuick 2.5 import QtQuick.Window 2.2 import QtQuick.Controls 1.4 import Util 1.0 // Таким образом производится импорт QML синглетона Window { visible: true width: 640 height: 480 title: qsTr("Singleton Class") ListView { anchors.fill: parent delegate: Item { height: 48 width: parent.width Text { anchors.fill: parent text: model.text verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } } model: listModel } ListModel { id: listModel Component.onCompleted: { // Обращение к методу синглетона выглядит, как обращение к статическому методу listModel.append({'text': Util.getMessage(1)}) listModel.append({'text': Util.getMessage(2)}) listModel.append({'text': Util.getMessage(3)}) listModel.append({'text': Util.getMessage(4)}) } } }
Підсумок
Таким чином, можна використовувати синглетон об'єкти QML для емуляції використання статичних методів, причому це правильний підхід для роботи з подібним функціоналом.