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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить сигнал из плагина  (Прочитано 4518 раз)
QCasper
Гость
« : Февраль 09, 2007, 09:40 »

Создаю приложение с плагинами стандартным кютешным подходом, как в книжке у Бланшета. То есть само приложение ничего не знает о плагине кроме его интерфейсного класса, который полностью абстрактный. Мне надо чтобы, приложение как-то узнавало, что в плагине произошли изменение, то есть надо как-то так сделать, чтобы я из плагина эмитил сигнал, который каким-то образом доходил до приложения. Вопрос как? Есть ли стандартные пути?
Записан
goer
Гость
« Ответ #1 : Февраль 09, 2007, 11:19 »

Определи сигнал как обычный pure virtual член в асбтрактном классе. А в реализации уже сделай его сигналом (засунь его в секцию signals)
Записан
QCasper
Гость
« Ответ #2 : Февраль 09, 2007, 11:49 »

Цитата: "goer"
Определи сигнал как обычный pure virtual член в асбтрактном классе. А в реализации уже сделай его сигналом (засунь его в секцию signals)


хорошо сделал, у меня в интерфейсе теперь есть void settingsChaged() = 0, который потом в реализации плагина прописан в секции signals. Но вот где проблема: указатель на объект класса плагина то у меня получается вот так:
Код:
IPlugin *interface = qobject_cast<IPlugin*>(loader.instance());

потом я собираюсь законнектить:
Код:
connect(interface, SIGNAL(settingsChanged()), this, SLOT(changeSettings()));

и тут мне компилятор говорит, вобщем-то я с ним абсолютно согласен, что IPlugin далеко не QObject, и мол нельзя так законнектить.

добавлено спустя 17 минут:

 Заработало. Сделал вот так:
Код:
connect(loader.instance(), SIGNAL(settingsChanged()), this, SLOT(changeSettings()));
Записан
Dendy
Гость
« Ответ #3 : Февраль 09, 2007, 14:22 »

Архи неверньІй подход.
Нужно делать так:

Код:
class MyObjectInterface : public QObject
{
  Q_OBJECT

...

signals:
  void mysignal();
};

class MyPluginInterface
{
public:
  virtual MyObjectInterface * createObject();
};


И оперировать классами MyObjectInterface.
Записан
QCasper
Гость
« Ответ #4 : Февраль 09, 2007, 14:58 »

А в чем минус того подхода?
Записан
Lion
Гость
« Ответ #5 : Февраль 09, 2007, 22:37 »

А я делаю вот так:
Код:
class IPlugin  {
public:
  virtual QObject *instance()=0;
};


Код:
class MyPlugin :
  public QObject,
  public IPlugin,
{
  Q_OBJECT;
  Q_INTERFACES(IPlugin);

public:
  virtual QObject *instance() { return this; }
};
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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