Evgenii Legotckoi
Шілде 5, 2017, 5: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. Для начала произведём его регистрацию.

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз