Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июль 17, 2012, 13:43



Название: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 17, 2012, 13:43
Добрый день ребята) Вот захотелось создать приложение с плагинной архитектурой, много статей перечитала в интернете. Принцп понятен, но есть небольшие пока что трудности для меня, хочу попросить кто может разъясните пожалуйста.
   Например, у меня есть класс который общий для всех плагинов. Он при запуске приложения смотрит его настройки находит какие плагины нужно подключить(название плагина и путь) и загружает их с помощью метода QCoreApplication::addLibraryPath();
   Каждый новый плагин обязан иметь метод inizialization(), с помощью которого он сам себя создаёт.
Вот вопрос, а как мне вызвать этот метод из подключенного плагина ??? Я хочу чтобы новый плагин добавил иконку в меню и таким образом стал работать. Но не очень пойму как мне связать так всё.
Пусть допустим в папке с новым плагином будет лежать файлик install.hb который читает мой общий класс(который подключает плагин) и сообщает меню о новом пункте. А вот как мне добавить действия на этот новый пункт меню, если я предположим не знаю какая функция в новом плагине должна вызываться при клике мышкой на иконке в меню ?
   Мне в основном не понятна связь, как плагины могут использовать друг друга и как система будет вызывать их фун-и если она не знает как они называются...
Пожалуйста, кто может объясните мне, можно и с примером)


Название: Re: приложение с плагинной архитектурой
Отправлено: lighting от Июль 17, 2012, 13:51
а вы искать что-нибудь пробовали? Вот например и описание и примеры http://qt-doc.ru/dinamicheskie-biblioteki-i-sistema-rasshirenij.html легко находится с помощью google.


Название: Re: приложение с плагинной архитектурой
Отправлено: Странник от Июль 17, 2012, 13:55
действительно не похоже, что вы уловили основную суть. взаимодействие с плагином осуществляется через интерфейс, известный вашему приложению. скрытой остается только внутренняя реализация.


Название: Re: приложение с плагинной архитектурой
Отправлено: Igors от Июль 17, 2012, 14:19
  Каждый новый плагин обязан иметь метод inizialization(), с помощью которого он сам себя создаёт.
Вот вопрос, а как мне вызвать этот метод из подключенного плагина ??? Я хочу чтобы новый плагин добавил иконку в меню и таким образом стал работать. Но не очень пойму как мне связать так всё.
Пусть допустим в папке с новым плагином будет лежать файлик install.hb который читает мой общий класс(который подключает плагин) и сообщает меню о новом пункте. А вот как мне добавить действия на этот новый пункт меню, если я предположим не знаю какая функция в новом плагине должна вызываться при клике мышкой на иконке в меню ?
Вам надо установить соглашения/протокол обмена данными между хостом и плагинами. Это можно делать по-всякому, используя классы или нет. Например

- хост (по каким-то правилам) обнаружил файл плагина, сделал LoadLibrary (dlopen)  и вызывает ф-цию плагина Init(). Эта ф-ция возвращает указатель на класс плагина который известен обоим - плагину и хосту. Дальше хост может уже вызывать методы этого класса (напр тот же GetIcon()).

 


Название: Re: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 17, 2012, 15:56
спасибо за ссылки, теперь стало всё понятней)


Название: Re: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 17, 2012, 16:01
А что делать если я хочу чтобы мой плагин подписался на какие-то сигналы из моего приложения? Это же в интерфейсе не продумаешь... или как-то можно учесть?


Название: Re: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 17, 2012, 16:45
Я придкмала решение проблемы через события. Хотела спросить:
если я создала своё событие как мне его имитировать(ну допустим в сигналах это emit) или только можно QCoreApplication::sendEvent(Receiver, &e);? Как бы так сделать чтобы произошедшее событие мог поймать любой класс?)
И это событие будет доступно и плагину ? (я у плагина переопределю фун-ю customEvent(QEvent* e))


Название: Re: приложение с плагинной архитектурой
Отправлено: andrew.k от Июль 17, 2012, 16:48
Я придкмала решение проблемы через события. Хотела спросить:
если я создала своё событие как мне его имитировать(ну допустим в сигналах это emit) или только можно QCoreApplication::sendEvent(Receiver, &e);? Как бы так сделать чтобы произошедшее событие мог поймать любой класс?)
И это событие будет доступно и плагину ? (я у плагина переопределю фун-ю customEvent(QEvent* e))
Тебе всего-то нужно внутри твоего плагина получить указатель на экземпляр объекта, который посылает нужный тебе сигнал.
Вот и предоставь для своих плагинов такую возможность. Зачем мучения с событиями?


Название: Re: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 17, 2012, 17:00
спасибо, это и вправду хорошая идея) ну а всё-таки как можно сделать событие глобальным ? Чтобы его мог поймать любой класс. Может кто подскажет? ;)


Название: Re: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 17, 2012, 18:06
А как можно реализовать такую возможность(просто спроектировать для дальнейшего) чтобы один плагин мог встраиваться в какую-нибудь форму. Например у меня есть форма где я могу просматривать видео, а мне бы хотелось чтобы после установки моего плагина в этой же форме под видео появилась ссылка "скачать видео себе". Мне бы просто понять как такого можно достичь, как нужно так хитро интерфейсы что-ли спроектировать?


Название: Re: приложение с плагинной архитектурой
Отправлено: _OLEGator_ от Июль 17, 2012, 18:17
Определить куда встраивать виджеты плагина, можно закладками, можно в меню добавлять. Расширить функционал плагина функцией, которая будет возвращать этот виджет, а основная программа его встроит куда надо.


Название: Re: приложение с плагинной архитектурой
Отправлено: mks от Июль 17, 2012, 18:31
а мне бы хотелось чтобы после установки моего плагина в этой же форме под видео появилась ссылка "скачать видео себе". Мне бы просто понять как такого можно достичь, как нужно так хитро интерфейсы что-ли спроектировать?
К примеру сделайте в вашем плагине метод:
Код:
QWidget * get_plugin_control();
Который вернёт виджет с кнопочками (или одной кнопкой - скачать видео). В основной программе вызываем этот метод, получаем виджет и вставляем его под видео.


Название: Re: приложение с плагинной архитектурой
Отправлено: virtual_root от Июль 18, 2012, 10:13
ага, спасибо ребята)


Название: Re: приложение с плагинной архитектурой
Отправлено: sidsukana от Май 13, 2014, 10:28
Добрый день!
Бьюсь с проблемой, не могу понять что не правильно.
Хочу сделать плагин, который загружается в основную программу статически

Сделал все по статьям http://qt-project.org/doc/qt-5/plugins-howto.html и http://qt-project.org/doc/qt-5/qtwidgets-t...ting-the-plugin

Получаю ошибку при компиляции основной программы (проекта)

Цитировать
debug/main.o: In function `ZN23StaticmpqPluginInstanceC1Ev':
C:\Sources\qsw\build/../qsw/main.cpp:6: undefined reference to `qt_static_plugin_mpq()'


Windows 7 x64, Qt 5.2.1 MinGW 32-bit. QtCreator 3.1


Название: Re: приложение с плагинной архитектурой
Отправлено: sidsukana от Май 13, 2014, 12:31
Проблема решена. Причина была в неправильном имени плагина в макросе импорта.