Создание расширения для приложения


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


TEMPLATE = lib
CONFIG   += plugin
QT       -= gui
DESTDIR  = ../plugins
SOURCES  = MyPlugin.cpp
HEADERS  = MyPlugin.h \
           ../Application/interfaces.h 
TARGET   = myplugin

Для создания расширения в секции CONFIG pro-файла необходимо добавить опцию plugin, а также включить в секцию HEADERS файл интерфейсов приложения interfaces.h.


#ifndef _MyPlugin_h_
#define _MyPlugin_h_

#include <QObject>
#include "../Application/interfaces.h"

class MyPlugin : public QObject, public StringInterface {
Q_OBJECT
Q_INTERFACES(StringInterface)

private:
    QString oddUpper(const QString& str);

public:
    virtual ~MyPlugin();

    virtual QStringList operations(                              ) const;
    virtual QString     operation (const QString&, const QString&);
};
#endif //_MyPlugin_h_

Наш класс расширения MyPlugin наследует сразу два класса: QObject и StringInterface. Добавление макроса Q_INTERFACES() нужно для того, чтобы МОС сгенерировал всю необходимую для расширения метаинформацию.

Виртуальный деструктор нам нужен для того, чтобы компилятор C++ не жаловался на то, что класс, имеющий виртуальные методы, не имеет виртуального деструктора.


/*virtual*/ QStringList MyPlugin::operations() const
{
    return QStringList() << "oddUpper" << "lower";
}

Метод operations() возвращает список поддерживаемых расширением операций. В нашем случае их две: oddUpper и lower.


QString MyPlugin::oddUpper(const QString& str)
{ 
    QString strTemp;

    for (int i = 0; i < str.length(); ++i) {
        strTemp += (i % 2) ? str.at(i) : str.at(i).toUpper();
    }

    return strTemp;
}

Метод oddUpper() нам уже знаком. Мы использовали его для нашей динамической библиотеки, а теперь мы используем его нашего расширения.


/*virtual*/ QString MyPlugin::operation(const QString& strText, 
                                        const QString& strOperation
                                       )
{
    QString strTemp;
    if (strOperation == "oddUpper") {
        strTemp = oddUpper(strText);
    }
    else if (strOperation == "lower") {
        strTemp = strText.toLower();
    }
    else {
        qDebug() << "Unsupported operation";
    }
    return strTemp;
}

Метод operation() получает текст и имя операции. Этого достаточно, чтобы вызвать нужную реализацию, отвечающую за проведение операции. Если имя операции будет не найдено — приложение выдаст сообщение о том, что данная операция не поддерживается.

В завершение, для создания нашего расширения мы должны экспортировать интерфейс, при помощи макроса Q_EXPORT_PLUGIN2(), в конце срр-файла. Этот макрос Q_EXPORT_PLUGIN2() задает точку входа нашего расширения, что делает его доступным для Qt:


Q_EXPORT_PLUGIN2(StringInterface, MyPlugin)

Читать далее: Динамические библиотеки в Qt. Заключение