Содержимое плагина

Добавлено 15 мая 2022 в 04:46

Плагин – это библиотека с определенным интерфейсом, которая загружается по запросу. Он отличается от библиотеки, поскольку библиотека связана и загружается при запуске приложения. В случае 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 {
}

Плагин может предоставлять несколько типов с одним и тем же модулем. Но предоставлять несколько модулей из одного плагина нельзя. Таким образом, между модулями и плагинами существует отношение один к одному. Эта связь выражается идентификатором модуля.

Теги

C++ / CppGUI / Графический интерфейс пользователяQMLQtQtQuickПлагин / PluginПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.