Всем доброго дня.
Помогите разобраться с системой расширений. В голове такая каша, что ниточки связать не могу.
Читаю книгу по Qt 5.10 Глава 42. В этой главе изначально идут динамические библиотеки, а потом система расширений.
С динамическими библиотеками вроде все понятно, но есть НО... Функции различные, ну к примеру там вычислить сумму двух слагаемых код накидать и с компилить в принципе я смогу и смогу подключить и воспользоваться этой функцией из библиотеки. Правда теоретически. Но разбирал я как то с человеком DLL и как их готовят и используют. Правда я могу лишь функции какие-нибудь накидать и использовать. Но этого еще никогда не делал.
А вот с системой расширений у меня голова запуталась и пока немогу понять (собственно как и в динамической бибилиотеке) точка входа в приложение размещенное в динамической библиотеке.
Возможно про точку входа я не правильно выразился, но я пока не совсем понимаю, что именно мне недает понять работу всего этого.
В общем как я понял из 42 главы для написания расширений к своему приложению необходимо подготовить "интерфейс" (класс с виртуальными определениями методов) и идентифицировать "интерфейс" при помощи макроса Q_DECLARE_INTERFACE() это для MOC с целью генерации метаинформации, которая в дальнейшем будет использоваться объектом класса QPluginLoader при загрузке плагина.
Сам плагин его класс должен наследоваться от двух классов QObject и класс выше созданного интерфейса.
по мимо макроса Q_OBJECT в определении класса, необходимо применить еще пару макросов - это Q_INTERFASES(наименование интерфейса) - это макрос нужен я так понимаю даем имя создаваемому интерфейсу плагина.
Q_PLUGIN_METADATA(IID "com.mysoft.Application.NameInterface" FILE "nameinterface.json") - а здесь прописываем метаинформацию по интерфейсу.
Описал часть того, что вроде понял. А вот дальше для меня по большей части темный лес похоже.
В книге описан плагин который предназначен для работы с текстом. Ну это про, что я и говорил функцию суммы накидать и все такое. А вот с GUI как работать?
К примеру плагин загружен ядром приложения и предоставляет определенный функционал. Например появляется QDockWidget (здесь ну незнаю краткая сводка выездов взятая с БД) или там QToolBar (с привяской к пунктам меню) и пункты в меню (при нажатии на пункт меню выходит окно и там какой-нибудь функционал).
Вот примеры из книги.
Сам класс "Интерфейса"
#pragma once
class QString;
class QStringList;
// ======================================================================
class StringInterface {
public:
virtual ~StringInterface() {}
virtual QStringList operations() const = 0;
virtual QString operation(const QString& strText,const QString& strOperation) = 0;
};
Q_DECLARE_INTERFACE(StringInterface,"com.mysoft.Application.StringInterface")
далее метод загрузки плагинов из указанной директории. То есть грузиться все, что является плагином. Там 2, 3, 10 плагинов и т.д.
void PluginsWindow::loadPlugins()
{
QDir dir(QCoreApplication::applicationDirPath());
#ifdef Q_OS_OSX
dir.cdUp();
#endif
if (!dir.cd("plugins")) {
QMessageBox::critical(0, "", "plugins directory does not exist");
return;
}
foreach (QString strFileName, dir.entryList(QDir::Files)) {
QPluginLoader loader(dir.absoluteFilePath(strFileName));
addToMenu(qobject_cast<QObject*>(loader.instance()));
}
}
Для меня тут впринципе вроде все понятно.
Дальше добавление пунктов в меню в зависимости от предоставляемых возможностей плагином.
void PluginsWindow::addToMenu(QObject* pobj)
{
if (!pobj) {
return;
}
StringInterface* pI = qobject_cast<StringInterface*>(pobj);
if (pI) {
QStringList lstOperations = pI->operations();
foreach (QString str, lstOperations) {
QAction* pact = new QAction(str, pobj);
connect(pact, SIGNAL(triggered()), this, SLOT(slotStringOperation()));
m_pmnuPlugins->addAction(pact);
}
}
}