Registering a QML Type as a Singleton object

Info Thread
By -
0

 Registering a QML Type as a Singleton object

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.

Tags:

Post a Comment

0Comments

Post a Comment (0)