- 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 для эмуляции использования статических методов, причём это правильный подход для работы с подобным функционалом.