Создание расширения для приложения
Оглавление
Теперь, когда мы имеем приложение, поддерживающее систему расширений, самое время создать для него хотя бы один компонент расширения.
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. Заключение