Russian Qt Forum
Ноябрь 20, 2024, 09:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: приложение с плагинной архитектурой  (Прочитано 6973 раз)
virtual_root
Гость
« : Июль 17, 2012, 13:43 »

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

а вы искать что-нибудь пробовали? Вот например и описание и примеры http://qt-doc.ru/dinamicheskie-biblioteki-i-sistema-rasshirenij.html легко находится с помощью google.
Записан
Странник
Гость
« Ответ #2 : Июль 17, 2012, 13:55 »

действительно не похоже, что вы уловили основную суть. взаимодействие с плагином осуществляется через интерфейс, известный вашему приложению. скрытой остается только внутренняя реализация.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 17, 2012, 14:19 »

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

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

 
Записан
virtual_root
Гость
« Ответ #4 : Июль 17, 2012, 15:56 »

спасибо за ссылки, теперь стало всё понятней)
Записан
virtual_root
Гость
« Ответ #5 : Июль 17, 2012, 16:01 »

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

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

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

спасибо, это и вправду хорошая идея) ну а всё-таки как можно сделать событие глобальным ? Чтобы его мог поймать любой класс. Может кто подскажет? Подмигивающий
Записан
virtual_root
Гость
« Ответ #9 : Июль 17, 2012, 18:06 »

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

Определить куда встраивать виджеты плагина, можно закладками, можно в меню добавлять. Расширить функционал плагина функцией, которая будет возвращать этот виджет, а основная программа его встроит куда надо.
Записан
mks
Гость
« Ответ #11 : Июль 17, 2012, 18:31 »

а мне бы хотелось чтобы после установки моего плагина в этой же форме под видео появилась ссылка "скачать видео себе". Мне бы просто понять как такого можно достичь, как нужно так хитро интерфейсы что-ли спроектировать?
К примеру сделайте в вашем плагине метод:
Код:
QWidget * get_plugin_control();
Который вернёт виджет с кнопочками (или одной кнопкой - скачать видео). В основной программе вызываем этот метод, получаем виджет и вставляем его под видео.
Записан
virtual_root
Гость
« Ответ #12 : Июль 18, 2012, 10:13 »

ага, спасибо ребята)
Записан
sidsukana
Гость
« Ответ #13 : Май 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
Записан
sidsukana
Гость
« Ответ #14 : Май 13, 2014, 12:31 »

Проблема решена. Причина была в неправильном имени плагина в макросе импорта.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.