Версия для печати темы
Форум на CrossPlatform.RU _ Qt GUI _ Копии плагина в приложении
Автор: fogi 2.4.2011, 22:10
Добрый вечер.
Существует MDI приложение sub-окна в которого создаются плагинами.
Плагин содержит набор функций для создания, настройки и обновления информации в окне.
Есть необходимость иметь несколько загруженных копий одного и того-же драйвера.
Пытаюсь сделать таким образом:
QList <UiInterface *> plugins;
..........
QObject *plugin = pluginLoader.instance();
if (plugin) {
uiInterface = qobject_cast<UiInterface *>(plugin);
if (uiInterface)
plugins.append(uiInterface);
}
.........
for(int i=0;i<plugins.count();i++)
plugins.at(i)->setLabelTitle(QString::number(i)); /// Текст почему-то устанавливается только у последнего созданного окна.
Помогите разобраться пожалуйста. Что я делаю не верно?
Спасибо.
Автор: Litkevich Yuriy 3.4.2011, 10:14
а что из себя представляет UiInterface, что делает его метод setLabelTitle()?
Автор: fogi 3.4.2011, 13:56
Цитата(Litkevich Yuriy @ 3.4.2011, 11:14)
а что из себя представляет UiInterface, что делает его метод setLabelTitle()?
UiInterface - dbhnefkmysq клас интерфейса к плагину
метод setLabelTitle() устанавливает текст виджету.
class UiInterface
{
public:
virtual ~EchoInterface() {}
virtual void createWidget(QWidget *parent) = 0;
virtual void setLabelTitle(const QString &message) = 0;
};
Автор: Litkevich Yuriy 3.4.2011, 19:32
Цитата(fogi @ 3.4.2011, 16:56)
метод setLabelTitle() устанавливает текст виджету.
какому? код этой функции приведи.
Автор: PAFOS 4.4.2011, 8:25
Цитата
Есть необходимость иметь несколько загруженных копий одного и того-же драйвера.
Я обычно в интерфейсе делаю функцию, которая создает экземпляр класса
class Interface
{
public:
virtual Interface *createInstance() = 0;
};
class MyImpl : Interface
{
public:
virtual MyImpl *createInstance()
{ return new MyImpl(); }
};
Автор: fogi 4.4.2011, 12:50
Цитата(PAFOS @ 4.4.2011, 9:25)
Я обычно в интерфейсе делаю функцию, которая создает экземпляр класса
Спасибо, помогло..
Может вы еще подскажете где можно посмотреть пример реального, не оч. сложного приложения использующего плагины?
Автор: PAFOS 4.4.2011, 14:04
quIM, MDC )
Автор: fogi 4.4.2011, 15:38
Цитата(PAFOS @ 4.4.2011, 15:04)
quIM, MDC )
Это слишком для меня..((
Полегче чтонить есть?
Автор: Litkevich Yuriy 4.4.2011, 18:13
Цитата(fogi @ 4.4.2011, 18:38)
Полегче чтонить есть?
%QTDIR%\examples и Асистент, с описанием примера плагина. Вроде Plug&Paint называется
Автор: fogi 5.4.2011, 10:00
Цитата(Litkevich Yuriy @ 4.4.2011, 19:13)
%QTDIR%\examples и Асистент, с описанием примера плагина. Вроде Plug&Paint называется
Это я все изучил, там все просто. Интересен пример фабрики плагинов, и менеджера плагинов.
Ничего доступного для своего понимания пока не нашел.. Увы..
Автор: wiz29 5.4.2011, 10:45
Цитата(fogi @ 5.4.2011, 10:00)
Цитата(Litkevich Yuriy @ 4.4.2011, 19:13)
%QTDIR%\examples и Асистент, с описанием примера плагина. Вроде Plug&Paint называется
Это я все изучил, там все просто. Интересен пример фабрики плагинов, и менеджера плагинов.
Ничего доступного для своего понимания пока не нашел.. Увы..
Фабрику плагинов ты можешь написатьсам, смотри в сторону патерна "Factory", у А.Александреску есть достаточно наглядные примеры создания фабрик.
Менеджер плагинов думаю будет зависеть от назначения и типов плагинов для твоего приложения.
Автор: fogi 6.4.2011, 15:32
Цитата(wiz29 @ 5.4.2011, 11:45)
Фабрику плагинов ты можешь написатьсам, смотри в сторону патерна "Factory", у А.Александреску есть достаточно наглядные примеры создания фабрик.
Менеджер плагинов думаю будет зависеть от назначения и типов плагинов для твоего приложения.
Спасибо
Автор: fogi 12.4.2011, 13:27
Пока не разобрался с менеджером плагинов. Может кто нибудь поможет выбрать верный путь?
1. Есть mdi приложение.
2. Окна в mdi приложении создаются плагинами.
3. Функцией плагина меняется информация в созданном окне.
Вопросы следующие:
1. Как лучше хранить экземпляры загруженных плагинов?
2. Как перехватить вызов закрытия окна прагина, и выгрузить соответствующий плагин из хранилища плагинов.
Автор: wiz29 12.4.2011, 13:34
Цитата(fogi @ 12.4.2011, 14:27)
Пока не разобрался с менеджером плагинов. Может кто нибудь поможет выбрать верный путь?
1. Есть mdi приложение.
2. Окна в mdi приложении создаются плагинами.
3. Функцией плагина меняется информация в созданном окне.
Вопросы следующие:
1. Как лучше хранить экземпляры загруженных плагинов?
2. Как перехватить вызов закрытия окна прагина, и выгрузить соответствующий плагин из хранилища плагинов.
1. в приложении можно хранить список QObject*
2. с плагином всегда связан некий QWidget?
Автор: fogi 12.4.2011, 15:35
Цитата(wiz29 @ 12.4.2011, 14:34)
1. в приложении можно хранить список QObject*
2. с плагином всегда связан некий QWidget?
1. где то так и собираюсь сделать.
2. Да, суть плагина создать дочернее окно и отображать в нем данные. Нужно чтобы при закрытии окна экземпляр плагина удалялся из QList
Автор: wiz29 12.4.2011, 15:51
ну тогда сделай интерфейс ко всем плагинам с методом получения QWidget*, далее установи eventFilters для этих окошек и, отловив QEvent::close , выгрузи соответствующий плагин , ну, соответственно, со всеми синхронизирующими вызовами.
Автор: fogi 12.4.2011, 17:48
Цитата(wiz29 @ 12.4.2011, 16:51)
ну тогда сделай интерфейс ко всем плагинам с методом получения QWidget*, далее установи eventFilters для этих окошек и, отловив QEvent::close , выгрузи соответствующий плагин , ну, соответственно, со всеми синхронизирующими вызовами.
А примерчика такой системы не найдется?
И еще вопросик как из сообщения о закрытии от виджета узнать какой экземпляр плагина в QList создал этот виджет? По Parent?
Автор: wiz29 13.4.2011, 9:07
Цитата(fogi @ 12.4.2011, 18:48)
И еще вопросик как из сообщения о закрытии от виджета узнать какой экземпляр плагина в QList создал этот виджет? По Parent?
Узнать оч просто, тк за твоими указателями на QObject* стоит некий плагин, он соответственно реализует некий интерфейс предоставляющий указатель QWidget*, простым проходом по списку плагинов и сравнением сответсвующих указателей на виджеты, либо хранить в приложении вместо списка плагинов ассоциативный массив с парами <QWidget*, QObject*>, тогда не нужно будет морочиться с кастами к тому или иному интерфейсу.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)