Класс QQmlExtensionPlugin
Класс QQmlExtensionPlugin предоставляет абстрактный базовый класс для пользовательских плагинов расширений QML. Подробнее...
| Заголовок: | #include <QQmlExtensionPlugin> |
| qmake: | QT += qml |
| С момента: | Qt 5.0 |
| Наследуется от: | QObject |
Открытые функции
| QQmlExtensionPlugin(QObject *parent = nullptr) | |
| QUrl | baseUrl() const |
Переопределённые открытые функции
| virtual void | initializeEngine(QQmlEngine *engine, const char *uri) override |
| virtual void | registerTypes(const char *uri) override = 0 |
- 34 открытые функции, унаследованные от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 1 открытый слот, унаследованный от QObject
- 2 сигнала, унаследованные от QObject
- 1 открытая переменная, унаследованная от QObject
- 10 статических открытых членов, унаследованных от QObject
- 9 защищённых функций, унаследованных от QObject
- 2 защищённых переменных, унаследованных от QObject
Подробное описание
Класс QQmlExtensionPlugin предоставляет абстрактный базовый класс для пользовательских плагинов расширений QML.
QQmlExtensionPlugin — это интерфейс плагина, который позволяет создавать расширения QML, которые можно динамически загружать в приложения QML. Эти расширения позволяют предоставлять в движке QML пользовательские типы QML.
Для написания плагина расширения QML:
- Наследуйте от QQmlExtensionPlugin
- Используйте макрос Q_PLUGIN_METADATA() для регистрации плагина в системе метаобъектов Qt
- Переопределите метод registerTypes() и вызовите qmlRegisterType() для регистрации типов, которые будут экспортированы плагином
- Напишите файл проекта для плагина
- Создайте файл 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) override
{
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 = nullptr)
Создаёт плагин расширения QML с заданным parent.
Обратите внимание, что этот конструктор вызывается автоматически макросом Q_PLUGIN_METADATA(), поэтому нет необходимости вызывать его явно.
QUrl QQmlExtensionPlugin::baseUrl() const
Возвращает URL каталога, из которого загружено расширение.
Это полезно, когда плагин также должен загружать файлы QML или другие ресурсы из того же каталога.
Эта функция была добавлена в Qt 5.1.
[override virtual] void QQmlExtensionPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
Инициализирует расширение по uri с помощью engine. В данном случае плагин приложения может, например, экспонировать некоторые данные или объекты для QML, как свойства контекста в корневом контексте движка.
[override pure virtual] void QQmlExtensionPlugin::registerTypes(const char *uri)
Регистрирует типы QML в заданном uri. Подклассы должны реализовать это, вызвав qmlRegisterType() для всех типов, предоставляемых плагином расширения QML.
uri — это идентификатор плагина, сгенерированный движком QML на основе имени и пути к библиотеке плагина расширения.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qqmlextensionplugin.html