Содержимое плагина
Плагин – это библиотека с определенным интерфейсом, которая загружается по запросу. Он отличается от библиотеки, поскольку библиотека связана и загружается при запуске приложения. В случае QML интерфейс называется QQmlExtensionPlugin
. Нас интересуют два метода: initializeEngine()
и registerTypes()
. Когда плагин загружается впервые, вызывается метод initializeEngine()
, который позволяет нам получить доступ к движку для предоставления корневому контексту объектов плагина. В большинстве случаев вы будете использовать только метод registerTypes()
. Он позволяет вам зарегистрировать свои пользовательские типы QML в движке по указанному URL.
Давайте рассмотрим это, создав небольшой служебный класс FileIO
. Он позволит вам читать и записывать текстовые файлы из QML. Первая итерация в фиктивной реализации QML может выглядеть так.
// FileIO.qml (хорошо)
QtObject {
function write(path, text) {};
function read(path) { return "TEXT" }
}
Это чистая реализация QML возможного API на основе C++. Мы используем ее для изучения API. Мы видим, что нам нужны функции read
и write
. Мы также видим, что функция записи принимает путь и текст, а функция чтения принимает путь и возвращает текст. Судя по всему, path
и text
являются общими параметрами, и, возможно, мы можем извлечь их как свойства, чтобы упростить использование API в декларативном контексте.
// FileIO.qml (лучше)
QtObject {
property url source
property string text
function write() {} // открываем файл и пишем текст
function read() {} // читаем файл и присваиваем свойству text
}
Да, это больше похоже на QML API. Мы используем свойства, чтобы позволить нашей среде привязываться к нашим свойствам и реагировать на изменения.
Чтобы создать этот API на C++, нам нужно создать интерфейс Qt C++, который выглядит следующим образом.
class FileIO : public QObject {
...
Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
...
public:
Q_INVOKABLE void read();
Q_INVOKABLE void write();
...
}
Тип FileIO
должен быть зарегистрирован в движке QML. Мы хотим использовать его в модуле org.example.io
.
import org.example.io 1.0
FileIO {
}
Плагин может предоставлять несколько типов с одним и тем же модулем. Но предоставлять несколько модулей из одного плагина нельзя. Таким образом, между модулями и плагинами существует отношение один к одному. Эта связь выражается идентификатором модуля.