Spec-Zone.ru › Qt 5.6

Класс QQmlExtensionPlugin

Класс QQmlExtensionPlugin предоставляет абстрактный базовый класс для пользовательских плагинов расширения QML. Подробнее...

Заголовок: #include <QQmlExtensionPlugin>
qmake: QT += qml
С момента: Qt 5.0
Наследуется от: QObject и QQmlExtensionInterface
  • Список всех членов, включая наследуемые члены

Открытые функции

QQmlExtensionPlugin(QObject *parent = Q_NULLPTR)
QUrl baseUrl() const

Переопределённые открытые функции

virtual void initializeEngine(QQmlEngine *engine, const char *uri)
virtual void registerTypes(const char *uri) = 0
  • 31 открытая функция, унаследованная от QObject
  • 1 открытая функция, унаследованная от QQmlExtensionInterface
  • 1 открытая функция, унаследованная от QQmlTypesExtensionInterface

Дополнительные унаследованные члены

  • 1 свойство, унаследованное от QObject
  • 1 открытый слот, унаследованный от QObject
  • 2 сигнала, унаследованные от QObject
  • 11 статические открытые члены, унаследованные от QObject
  • 9 защищённые функции, унаследованные от QObject

Подробное описание

Класс QQmlExtensionPlugin предоставляет абстрактный базовый класс для пользовательских плагинов расширения QML.

QQmlExtensionPlugin — это интерфейс плагина, который позволяет создавать расширения QML, которые могут динамически загружаться в приложения QML. Эти расширения позволяют предоставлять в движке QML пользовательские типы QML.

Чтобы написать плагин расширения QML:

  1. Наследуйте от QQmlExtensionPlugin
    • Используйте макрос Q_PLUGIN_METADATA() для регистрации плагина в системе метаобъектов Qt
    • Переопределите метод registerTypes() и вызовите qmlRegisterType() для регистрации типов, которые должны экспортироваться плагином
  2. Напишите файл проекта для плагина
  3. Создайте файл qmldir для описания плагина

Плагины расширения QML предназначены для плагинов, специфичных для приложения, или для плагинов типа библиотеки. Плагины библиотек должны ограничивать себя регистрацией типов, так как любые манипуляции с корневым контекстом движка могут вызвать конфликты или другие проблемы в коде пользователя библиотеки.

Пример плагина

Предположим, есть новый TimeModel класс C++, который должен быть доступен как новый тип QML. Он предоставляет текущее время через свойства hour и minute.

class TimeModel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int hour READ hour NOTIFY timeChanged)
    Q_PROPERTY(int minute READ minute NOTIFY timeChanged)
    ...

Чтобы сделать этот тип доступным, мы создаём класс плагина под названием QExampleQmlPlugin, который является подклассом QQmlExtensionPlugin. Он переопределяет метод registerTypes(), чтобы зарегистрировать тип TimeModel с помощью qmlRegisterType(). Он также использует макрос Q_PLUGIN_METADATA() в определении класса, чтобы зарегистрировать плагин в системе метаобъектов Qt с помощью уникального идентификатора плагина.

class QExampleQmlPlugin : public QQmlExtensionPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)

public:
    void registerTypes(const char *uri)
    {
        Q_ASSERT(uri == QLatin1String("TimeExample"));
        qmlRegisterType<TimeModel>(uri, 1, 0, "Time");
    }
};

Это регистрирует класс TimeModel с версией 1.0 этой библиотеки плагинов как тип QML под названием Time. Макрос Q_ASSERT() может гарантировать, что пространство имён типа импортируется корректно любыми компонентами QML, использующими этот плагин. Статья Определение типов QML из C++ содержит более подробную информацию о регистрации типов C++ в среде выполнения.

Кроме того, файл проекта (.pro) определяет проект как библиотеку плагинов, указывает, что он должен быть скомпилирован в каталог imports/TimeExample, и регистрирует имя целевого плагина и различные другие детали:

TEMPLATE = lib
CONFIG += qt plugin
QT += qml

DESTDIR = imports/TimeExample
TARGET = qmlqtimeexampleplugin
SOURCES += qexampleqmlplugin.cpp

Наконец, требуется файл qmldir в каталоге imports/TimeExample для описания плагина и типов, которые он экспортирует. Плагин включает файл Clock.qml вместе с файлом qmlqtimeexampleplugin, который создаётся проектом (как показано выше в файле .pro). Поэтому оба файла должны быть указаны в файле qmldir.

module TimeExample
Clock 1.0 Clock.qml
plugin qmlqtimeexampleplugin

Для упрощения этого примера, каталог исходных файлов TimeExample находится в imports/TimeExample, и мы используем построение в исходном коде. Однако структура каталога исходного кода не так важна, так как файл qmldir может указывать пути к установленным файлам QML.

Важным является имя каталога, в который устанавливается qmldir. При импорте модуля пользователем движок QML использует идентификатор модуля (TimeExample), чтобы найти плагин, и поэтому каталог, в который он устанавливается, должен совпадать с идентификатором модуля.

После сборки и установки проекта новый компонент Time доступен для любого компонента QML, который импортирует модуль TimeExample.

import TimeExample 1.0 // import types from the plugin

Clock { // this class is defined in QML (imports/TimeExample/Clock.qml)

    Time { // this class is defined in C++ (plugin.cpp)
        id: time
    }

    hours: time.hour
    minutes: time.minute

}

Полный исходный код доступен в примере плагинов.

Учебник Создание расширений QML с помощью C++ также содержит главу о создании плагинов QML.

Обратите внимание, что версия Qt Quick 1 называется QDeclarativeExtensionPlugin.

См. также QQmlEngine::importPlugin() и Как создать плагины Qt.

Документация по членам функций

QQmlExtensionPlugin::QQmlExtensionPlugin(QObject *parent = Q_NULLPTR)

Конструирует плагин расширения QML с заданным parent.

Обратите внимание, что этот конструктор вызывается автоматически макросом Q_PLUGIN_METADATA(), поэтому нет необходимости вызывать его явно.

QUrl QQmlExtensionPlugin::baseUrl() const

Возвращает URL каталога, из которого загружается расширение.

Это полезно, когда плагину также необходимо загрузить файлы QML или другие ресурсы из того же каталога.

Функция была добавлена в Qt 5.1.

[virtual] void QQmlExtensionPlugin::initializeEngine(QQmlEngine *engine, const char *uri)

Инициализирует расширение из uri с помощью engine. Например, плагин приложения может здесь экспортировать некоторые данные или объекты в QML как свойства контекста в корневом контексте движка.

[pure virtual] void QQmlExtensionPlugin::registerTypes(const char *uri)

Регистрирует типы QML в заданном uri. Подклассы должны реализовывать это, вызывая qmlRegisterType() для всех типов, предоставляемых плагином расширения.

uri — это идентификатор плагина, сгенерированный движком QML на основе имени и пути библиотеки плагина расширения.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qqmlextensionplugin.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API