Создание Qt-плагинов

Создание Qt плагинов

Плагины в Qt — динамически подключаемые библиотеки. Мы уже немного затрагивали преимущества от использования плагинов, когда говорили о создании гибкого кода.

А сейчас займемся практикой и напишем свой собственный Qt-плагин.

Создание интерфейса плагина

Опишем интерфейс плагина в файле myplugininterface.h:

MyPluginInterface предоставляет две операции, возвращающих значения. Особый интерес представляет вторая (getVar()), которая работает с обобщенным типом QVariant. С его помощью вы можете создавать сверх-универсальные интерфейсы.

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

Идентификационная строка состоит из нескольких частей (по структуре похоже на название пакетов в Java):

  1. Обратный адрес домена;
  2. Название приложения, в котором определен интерфейс;
  3. Имя интерфейса;
  4. Номер версии интерфейса (через слэш).

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

Реализация плагина

Создадим файл проекта (MyPlugin.pro):

Конфигурация проекта напоминает обычную динамическую библиотеку. Ключевое отличие заключается в строке CONFIG += plugin. Она указывает на то, что создаем мы именно плагин, а не что-то другое.

INCLUDEPATH определен таким образом, чтобы мы смогли использовать myplugininterface.h. Скомпонованный плагин будет помещен в DESTDIR.

Заголовочный файл myplugin.h:

Три важных момента:

  1. Наследование QObject обязательно;
  2. Без Q_OBJECT плагин работать не будет;
  3. С помощью макроса Q_INTERFACES явно указываются реализуемые интерфейсы.

Соответствующая реализация (myplugin.cpp):

Главное: не забудьте экспортировать плагин с помощью макроса Q_EXPORT_PLUGIN2.

Использование плагина в приложении

Для подключения плагинов к Qt-приложению не нужно никаких особых настроек проекта. Создадим простое консольное Qt-приложение с таким main.cpp:

Поиск плагинов осуществляется в цикле по содержимому каталога ./plugins. Загрузить Qt-плагин можно с помощью QPluginLoader.

Явно вызывать load() не обязательно. Загрузка в любом случае произойдет при получении экземпляра экспортированного класса из плагина (функция-член instance()).

Функция instance() возвращает указатель на QObject. Чтобы начать работу с плагином, требуется сделать приведение типа. Для этого используйте qobject_cast.

Важно: не освобождайте память для созданного объекта. Если объект вам больше не нужен, то вызовите функцию unload(). В этом случае плагин выгрузится из памяти со всеми созданными экземплярами.

Результат работы программы:

Понравилась статья? Поделиться с друзьями:
Комментариев: 4
  1. Anonymous

    Начинаю писать свой сайт. Очень полезная инфа.

    1. 404 (автор)

      Рад слышать. Удачи! :)

  2. overlapped

    Очень хотелось бы почитать про Qt Scripting, собственно, тоже как еще одно средство расширения функционала основного приложения…

    1. 404 (автор)

      К следующей неделе постараюсь подготовить вводную статью.

Добавить комментарий