Название: Сигналы и Слоты в Плагинах Qt Отправлено: chipset от Май 31, 2007, 11:36 Здравствуйте, не подскажите есть ли возможность посылать и получать сигналы в плагин и наоборот в главную программу? ...
Название: Re: Сигналы и Слоты в Плагинах Qt Отправлено: QCasper от Май 31, 2007, 13:49 Здравствуйте, есть.
Название: Re: Сигналы и Слоты в Плагинах Qt Отправлено: chipset от Май 31, 2007, 14:15 Цитата: "QCasper" Здравствуйте, есть. не дадите пример... или куда глЯдеть? Название: Re: Сигналы и Слоты в Плагинах Qt Отправлено: QCasper от Май 31, 2007, 16:04 Цитата: "chipset" Цитата: "QCasper" Здравствуйте, есть. не дадите пример... или куда глЯдеть? Я сделал так: создал класс, наследованный от интерфейса, который виден и плагину и приложению. Методы класса - сигналы/слоты. В самом плагине есть метод, который возвращет указатель на объект класса. Вот через него все и происходит. Типа такого: Код:
далее внутри плагина сигнал можно сэмитить так: Код: emit m_Notifyer->someSignal() в приложении сигнал обрабатывается так: Код: connect(plugin->notifyer(), SIGNAL(someSignal()), this, SLOT(applicationSlot())); где plugin - указатель на корневой объект плагина. вроде ниче не забыл... Название: Сигналы и Слоты в Плагинах Qt Отправлено: chipset от Июнь 01, 2007, 09:32 to QCasper:
не получается ... :( In member function ‘virtual INotifyer* Plugin::notifyer()’: ../../plugandpaint/interfaces.h:93: error: cannot allocate an object of abstract type ‘Notifyer’ ../../plugandpaint/interfaces.h:74: note: because the following virtual functions are pure within ‘Notifyer’: ../../plugandpaint/interfaces.h:77: note: virtual void Notifyer::someSignal() ../../plugandpaint/interfaces.h:80: note: virtual void Notifyer::someSlot() ../../plugandpaint/interfaces.h:77: note: virtual void Notifyer::someSignal() ../../plugandpaint/interfaces.h:80: note: virtual void Notifyer::someSlot() 92 if (!m_Notifyer) 93 m_Notifyer = new Notifyer(); 94 return m_Notifyer; в чём подвох? Использую Qt4.4 Название: Сигналы и Слоты в Плагинах Qt Отправлено: Steven_Orko от Июнь 01, 2007, 10:27 Цитата: "chipset" в чём подвох? В том, что ты переписал код не глядя. Хоть бы разобрался. В коде, приведенном QCasper, используются чисто виртуальные (pure virtual) члены-функции. А класс с такими членами считается абстрактным, и создать экземпляр такого класса нельзя. Название: Сигналы и Слоты в Плагинах Qt Отправлено: chipset от Июнь 01, 2007, 15:41 я начинающий.... подскажите, плиз
добавлено спустя 4 часа 27 минут: спасибо за подсказки.. но не удаётся... попробывал различные варианты.. пример скомпилился, но плагин не работает... добавлено спустя 39 минут: если присутствует в коде строчка QPushButton quit("Quit", &window); плагин перестаёт грузится, если строчку убрать ... то плагин грузится, но не работает.... ниукого нет готового примера с применением сигналов и слотов.... Название: Сигналы и Слоты в Плагинах Qt Отправлено: Lion от Июнь 01, 2007, 20:15 Сигналы и слоты работают только в наследниках QObject и для подключения нужна ссылка на QObject, для этого в интерфейс (INotifyer) надо поместить функцию возвращающую ссылку на Notifyer как на QObject:
Код: virtual QObject *instance() = 0; А в Notifyer: Код: virtual QObject *instance() { return this; } В приложени сигнал обрабатывается так: Код: connect(plugin->notifyer()->instance(), SIGNAL(someSignal()), this, SLOT(applicationSlot())); Пример приведенный QCasper работать не будет т.к. plugin->notifyer() возвращает ссылку на INotifyer*, которая не может быть приведена к QObject* и функция connect() выдаст ошибку. Название: Сигналы и Слоты в Плагинах Qt Отправлено: QCasper от Июнь 01, 2007, 21:39 Цитата: "Lion" Сигналы и слоты работают только в наследниках QObject Пример приведенный QCasper работать не будет т.к. plugin->notifyer() возвращает ссылку на INotifyer*, которая не может быть приведена к QObject* и функция connect() выдаст ошибку. Да, я ошибся немного, в таком виде как я привел, конструкция действительно работать не будет. На самом деле интерфейс INotifyer я наследую от QObject, и потом уже при объявлении класса Notifyer можно обойтись без множественного наследования: Код: class INotifyer : public QObject { Как вариант, можно использовать конструкцию, предлагаемую Lion'ом, но моя получается короче (в плане кодописанины) при соединении ;) Код: connect(plugin->notifyer(), SIGNAL(someSignal()), this, SLOT(applicationSlot())); vs Код: connect(plugin->notifyer()->instance(), SIGNAL(someSignal()), this, SLOT(applicationSlot())); |