Название: приложение с плагинной архитектурой Отправлено: 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 Проблема решена. Причина была в неправильном имени плагина в макросе импорта.
|