Russian Qt Forum
Ноябрь 20, 2024, 09:27
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
приложение с плагинной архитектурой
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: приложение с плагинной архитектурой (Прочитано 6973 раз)
virtual_root
Гость
приложение с плагинной архитектурой
«
:
Июль 17, 2012, 13:43 »
Добрый день ребята) Вот захотелось создать приложение с плагинной архитектурой, много статей перечитала в интернете. Принцп понятен, но есть небольшие пока что трудности для меня, хочу попросить кто может разъясните пожалуйста.
Например, у меня есть класс который общий для всех плагинов. Он при запуске приложения смотрит его настройки находит какие плагины нужно подключить(название плагина и путь) и загружает их с помощью метода QCoreApplication::addLibraryPath();
Каждый новый плагин обязан иметь метод inizialization(), с помощью которого он сам себя создаёт.
Вот вопрос, а как мне вызвать этот метод из подключенного плагина
Я хочу чтобы новый плагин добавил иконку в меню и таким образом стал работать. Но не очень пойму как мне связать так всё.
Пусть допустим в папке с новым плагином будет лежать файлик install.hb который читает мой общий класс(который подключает плагин) и сообщает меню о новом пункте. А вот как мне добавить действия на этот новый пункт меню, если я предположим не знаю какая функция в новом плагине должна вызываться при клике мышкой на иконке в меню ?
Мне в основном не понятна связь, как плагины могут использовать друг друга и как система будет вызывать их фун-и если она не знает как они называются...
Пожалуйста, кто может объясните мне, можно и с примером)
«
Последнее редактирование: Июль 17, 2012, 13:48 от virtual_root
»
Записан
lighting
Гость
Re: приложение с плагинной архитектурой
«
Ответ #1 :
Июль 17, 2012, 13:51 »
а вы искать что-нибудь пробовали? Вот например и описание и примеры
http://qt-doc.ru/dinamicheskie-biblioteki-i-sistema-rasshirenij.html
легко находится с помощью google.
Записан
Странник
Гость
Re: приложение с плагинной архитектурой
«
Ответ #2 :
Июль 17, 2012, 13:55 »
действительно не похоже, что вы уловили основную суть. взаимодействие с плагином осуществляется через интерфейс, известный вашему приложению. скрытой остается только внутренняя реализация.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: приложение с плагинной архитектурой
«
Ответ #3 :
Июль 17, 2012, 14:19 »
Цитата: virtual_root от Июль 17, 2012, 13:43
Каждый новый плагин обязан иметь метод inizialization(), с помощью которого он сам себя создаёт.
Вот вопрос, а как мне вызвать этот метод из подключенного плагина
Я хочу чтобы новый плагин добавил иконку в меню и таким образом стал работать. Но не очень пойму как мне связать так всё.
Пусть допустим в папке с новым плагином будет лежать файлик install.hb который читает мой общий класс(который подключает плагин) и сообщает меню о новом пункте. А вот как мне добавить действия на этот новый пункт меню, если я предположим не знаю какая функция в новом плагине должна вызываться при клике мышкой на иконке в меню ?
Вам надо установить соглашения/протокол обмена данными между хостом и плагинами. Это можно делать по-всякому, используя классы или нет. Например
- хост (по каким-то правилам) обнаружил файл плагина, сделал LoadLibrary (dlopen) и вызывает ф-цию плагина Init(). Эта ф-ция возвращает указатель на класс плагина который известен обоим - плагину и хосту. Дальше хост может уже вызывать методы этого класса (напр тот же GetIcon()).
Записан
virtual_root
Гость
Re: приложение с плагинной архитектурой
«
Ответ #4 :
Июль 17, 2012, 15:56 »
спасибо за ссылки, теперь стало всё понятней)
Записан
virtual_root
Гость
Re: приложение с плагинной архитектурой
«
Ответ #5 :
Июль 17, 2012, 16:01 »
А что делать если я хочу чтобы мой плагин подписался на какие-то сигналы из моего приложения? Это же в интерфейсе не продумаешь... или как-то можно учесть?
Записан
virtual_root
Гость
Re: приложение с плагинной архитектурой
«
Ответ #6 :
Июль 17, 2012, 16:45 »
Я придкмала решение проблемы через события. Хотела спросить:
если я создала своё событие как мне его имитировать(ну допустим в сигналах это emit) или только можно QCoreApplication::sendEvent(Receiver, &e);? Как бы так сделать чтобы произошедшее событие мог поймать любой класс?)
И это событие будет доступно и плагину ? (я у плагина переопределю фун-ю customEvent(QEvent* e))
Записан
andrew.k
Гость
Re: приложение с плагинной архитектурой
«
Ответ #7 :
Июль 17, 2012, 16:48 »
Цитата: virtual_root от Июль 17, 2012, 16:45
Я придкмала решение проблемы через события. Хотела спросить:
если я создала своё событие как мне его имитировать(ну допустим в сигналах это emit) или только можно QCoreApplication::sendEvent(Receiver, &e);? Как бы так сделать чтобы произошедшее событие мог поймать любой класс?)
И это событие будет доступно и плагину ? (я у плагина переопределю фун-ю customEvent(QEvent* e))
Тебе всего-то нужно внутри твоего плагина получить указатель на экземпляр объекта, который посылает нужный тебе сигнал.
Вот и предоставь для своих плагинов такую возможность. Зачем мучения с событиями?
Записан
virtual_root
Гость
Re: приложение с плагинной архитектурой
«
Ответ #8 :
Июль 17, 2012, 17:00 »
спасибо, это и вправду хорошая идея) ну а всё-таки как можно сделать событие глобальным ? Чтобы его мог поймать любой класс. Может кто подскажет?
Записан
virtual_root
Гость
Re: приложение с плагинной архитектурой
«
Ответ #9 :
Июль 17, 2012, 18:06 »
А как можно реализовать такую возможность(просто спроектировать для дальнейшего) чтобы один плагин мог встраиваться в какую-нибудь форму. Например у меня есть форма где я могу просматривать видео, а мне бы хотелось чтобы после установки моего плагина в этой же форме под видео появилась ссылка "скачать видео себе". Мне бы просто понять как такого можно достичь, как нужно так хитро интерфейсы что-ли спроектировать?
Записан
_OLEGator_
Гость
Re: приложение с плагинной архитектурой
«
Ответ #10 :
Июль 17, 2012, 18:17 »
Определить куда встраивать виджеты плагина, можно закладками, можно в меню добавлять. Расширить функционал плагина функцией, которая будет возвращать этот виджет, а основная программа его встроит куда надо.
Записан
mks
Гость
Re: приложение с плагинной архитектурой
«
Ответ #11 :
Июль 17, 2012, 18:31 »
Цитата: virtual_root от Июль 17, 2012, 18:06
а мне бы хотелось чтобы после установки моего плагина в этой же форме под видео появилась ссылка "скачать видео себе". Мне бы просто понять как такого можно достичь, как нужно так хитро интерфейсы что-ли спроектировать?
К примеру сделайте в вашем плагине метод:
Код:
QWidget * get_plugin_control();
Который вернёт виджет с кнопочками (или одной кнопкой - скачать видео). В основной программе вызываем этот метод, получаем виджет и вставляем его под видео.
Записан
virtual_root
Гость
Re: приложение с плагинной архитектурой
«
Ответ #12 :
Июль 18, 2012, 10:13 »
ага, спасибо ребята)
Записан
sidsukana
Гость
Re: приложение с плагинной архитектурой
«
Ответ #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
Гость
Re: приложение с плагинной архитектурой
«
Ответ #14 :
Май 13, 2014, 12:31 »
Проблема решена. Причина была в неправильном имени плагина в макросе импорта.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...