Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на 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) *
Я обычно в интерфейсе делаю функцию, которая создает экземпляр класса


Спасибо, помогло.. :clapping:

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

Автор: PAFOS 4.4.2011, 14:04

quIM, MDC )

Автор: fogi 4.4.2011, 15:38

Цитата(PAFOS @ 4.4.2011, 15:04) *
quIM, MDC )


Это слишком для меня..((

Полегче чтонить есть? :mellow:

Автор: 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)