Russian Qt Forum

Qt => Общие вопросы => Тема начата: QCasper от Февраль 09, 2007, 09:40



Название: Получить сигнал из плагина
Отправлено: QCasper от Февраль 09, 2007, 09:40
Создаю приложение с плагинами стандартным кютешным подходом, как в книжке у Бланшета. То есть само приложение ничего не знает о плагине кроме его интерфейсного класса, который полностью абстрактный. Мне надо чтобы, приложение как-то узнавало, что в плагине произошли изменение, то есть надо как-то так сделать, чтобы я из плагина эмитил сигнал, который каким-то образом доходил до приложения. Вопрос как? Есть ли стандартные пути?


Название: Получить сигнал из плагина
Отправлено: goer от Февраль 09, 2007, 11:19
Определи сигнал как обычный pure virtual член в асбтрактном классе. А в реализации уже сделай его сигналом (засунь его в секцию signals)


Название: Получить сигнал из плагина
Отправлено: QCasper от Февраль 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 от Февраль 09, 2007, 14:22
Архи неверньІй подход.
Нужно делать так:

Код:
class MyObjectInterface : public QObject
{
  Q_OBJECT

...

signals:
  void mysignal();
};

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


И оперировать классами MyObjectInterface.


Название: Получить сигнал из плагина
Отправлено: QCasper от Февраль 09, 2007, 14:58
А в чем минус того подхода?


Название: Получить сигнал из плагина
Отправлено: Lion от Февраль 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; }
};