LINUX.ORG.RU

Красивая реализация плагинов

 ,


1

1

Что-то мне ничего нормального в голову не приходит. Может кто подкинет идейку? А то мои попахивают костылями. Нужно чтобы приложение могло полноценно общаться с плагином, как лучше спроектировать API? Нужны как get\set методы, так и сигналы-слоты. Иными словами, как научить плагин полноценно общаться с приложением? Echo Plugin example смотрел, но у меня ситуация куда сложнее, и одного лишь метода в интерфейсе недостаточно, нужна и обратная связь.



Последнее исправление: post-factum (всего исправлений: 2)
Ответ на: комментарий от Kalashnikov

А как быть если плагин хочет подключиться к сигналу\подключиться к слоту приложения? Например, если нам надо слушать сигналы какого-нибудь гуя? Понятное дело что надо отдать плагину ссылку, но как бы сделать красивый хедер с API без излишеств?

flareguner
() автор топика
Ответ на: комментарий от KblCb

Echo Plugin example смотрел, но у меня ситуация куда сложнее, и одного лишь метода в интерфейсе недостаточно, нужна и обратная связь.

flareguner
() автор топика
Ответ на: комментарий от flareguner

Можно сделать синглетон к интерфейсу которого будут обращаться плагины чтобы поработать с гуём. А можно вспомнить что QApplication уже синглетон.

KblCb ★★★★★
()
Ответ на: комментарий от flareguner

Ну вроде можно объявить абстрактный интерфейс с заголовками сигналов/слотов, потом плагины наследовать от него и от QObject и в нём уже описывать их как сигналы/слоты.

Мне в моём школокоде тоже так хотелось сделать, спрашивал на лоре, в итоге сделал так (плагин).

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

О! Вона как хитро можно сигналы и слоты объявить, без спецификатора видимости в самом интерфейсе. Уже эта информация будет очень полезна. Жду ещё интересных идей.

flareguner
() автор топика
Ответ на: комментарий от Kalashnikov

И как насчет обратного, т.е., чтобы сам плагин подрубался к заведомо известному слоту приложения? И как бы так хитро выделить API в отдельный класс чтобы было аккуратно?

flareguner
() автор топика
Ответ на: комментарий от flareguner

Вообще, в большинстве случаев хватает того что плагин просто умеет экспортировать в приложение списки action'ов и виджетов, которые приложение как-то компонует и отображает пользователю.

Но если тебе так нужно соединение сигналов и слотов приложения и плагина, то проблему можно решить очень просто. Следует помнить что QApplication — синглетон, объект существующий в приложении в одном экземпляре. В любом месте своего кода ты можешь получить указатель на этот объект при помощи статического метода instance(). Наследуешь QApplication или определяешь в нём доступные для плагинов сигналы и слоты, либо пишешь ему методы возвращающие указатели на объекты у которых уже в свою очередь есть нужные плагинам сигналы и слоты.

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

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Тоже неплохая идея, я уже и позабыл что так можно. Спасибо!

flareguner
() автор топика

Можно попробовать посмотреть в сторону QMetaSystem.
Там много вкусного есть.

trex6 ★★★★★
()
Ответ на: комментарий от flareguner

А в чём проблема? В коде который загружает плагины (да или где угодно в приложении) можно спокойно связать любой сигнал со слотом плагина, только надо скастовать его к QObject.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

А наоборот, из плагина подключаться к слоту приложения? Дело в том, что слоты нужны не всегда все.

flareguner
() автор топика
Ответ на: комментарий от flareguner

Тут уже не уверен, да и мне всё равно кажется что рулить подключениями должно приложеие.

Выше предлагали через QApplication или передавать указатель например.

Kalashnikov ★★★
()
Ответ на: комментарий от KblCb

«5.1ть если вы не понимаете» (с) же :) Че-то часто в последнее время треды про «красивую реализацию». Кто-то любит «все красивое».

slackwarrior ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.