- 1. Project structure
- 2. main.cpp
- 3. Util.qml
- 4. main.qml
- 5. Conclusion
In addition to C ++ classes in QML, Singleton can also use QML types, which are separate QML files.
This is also used by qmlRegisterSingletonType , but in order for this type to work as a singleton of the object, it is necessary to register the pragma Singleton in the QML file itself.
Let's make a small application that will also output several messages, while messages will be picked up through the Singleton QML Type method.
Project structure
- SingletonQML.pro - project profile
- main.cpp - File with main function
- main.qml - Main QML file
- Util.qml - Singleton QML
The project profile will be created by default and will not be changed.
main.cpp
As the Singleton object use the file Util.qml. To make it a Singleton, it must be registered with qmlRegisterSingletonType, and also specify the pragma Singleton directive in it. First, we will register it.
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQml> // We connect to use the qmlRegisterSingletonType function int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // We register the qml file by specifying its path. 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
In this file, be sure to specify the directive pragma Singleton.
pragma Singleton // We indicate that this QML Type is a singleton 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
And now we use the singleton object to output text using this function.
import QtQuick 2.5 import QtQuick.Window 2.2 import QtQuick.Controls 1.4 import Util 1.0 // Thus, the import of QML singleton 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: { // The appeal to the singleton method looks like a call to the static method listModel.append({'text': Util.getMessage(1)}) listModel.append({'text': Util.getMessage(2)}) listModel.append({'text': Util.getMessage(3)}) listModel.append({'text': Util.getMessage(4)}) } } }
Conclusion
In this way, you can use singleton QML objects to emulate the use of static methods, and this is the right approach for working with similar functionality.