Класс 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 |
- 31 открытая функция, унаследованная от QObject
Статические открытые члены
| const QMetaObject | staticMetaObject |
- 9 статических открытых членов, унаследованных от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 1 открытый слот, унаследованный от QObject
- 2 сигнала, унаследованные от QObject
- 9 защищённых функций, унаследованных от QObject
Подробное описание
Класс QQmlExtensionPlugin предоставляет абстрактный базовый класс для пользовательских плагинов расширения QML.
QQmlExtensionPlugin — это интерфейс плагина, который позволяет создавать расширения QML, которые могут динамически загружаться в приложения QML. Эти расширения позволяют предоставлять пользовательские типы QML движку QML.
Чтобы написать плагин расширения QML:
- Подклассируйте QQmlExtensionPlugin
- Используйте макрос Q_PLUGIN_METADATA() для регистрации плагина в системе метаобъектов Qt
- Переопределите метод registerTypes() и вызовите qmlRegisterType() для регистрации типов, которые должны экспортироваться плагином
- Напишите файл проекта для плагина
- Создайте файл qmldir для описания плагина
Плагины расширения QML предназначены для плагинов, специфичных для приложения, или для плагинов, подобных библиотекам. Плагины библиотек должны ограничиваться регистрацией типов, так как любое изменение корневого контекста движка может привести к конфликтам или другим проблемам в коде пользователя библиотеки.
Плагин расширения QML TimeExample
Предположим, есть новый 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
Наконец, необходим файл 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.
См. также 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() для всех типов, предоставляемых плагином расширения.
uri — это идентификатор плагина, сгенерированный движком QML на основе имени и пути библиотеки плагина расширения.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qqmlextensionplugin.html