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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигналы, слоты и наследование  (Прочитано 4141 раз)
blood_shadow
Гость
« : Сентябрь 20, 2011, 20:51 »

Суть в том что обрабатываю сообщения 2 классами:
Код
C++ (Qt)
class Message
{
 
protected:
   QString message;
 
public:
   Message() {}
   virtual ~Message() {}
 
   virtual QString showMessage() const = 0;
 
};
 
 
class UserInteraction : public Message
{
 
public:
   UserInteraction(QString action);
   ~UserInteraction() {}
 
   QString showMessage() const;
 
};
 
class UserError : public Message
{
 
public:
   UserNotifier(QString mess);
   ~UserNotifier() {}
 
   QString showMessage() const;
 
};
 

Хотелось бы сделать так:
Код
C++ (Qt)
connect(sender_1, SIGNAL(sendError(UserError*)),
   receiver, SLOT(updateStatus(Message*)));
 
connect(sender_2, SIGNAL(sendMessage(UserInteraction*)),
   receiver, SLOT(updateStatus(Message*)));
 

Но подключение не проходит и выбрасывает сообщение
Код:
QObject::connect: Incompatible sender/receiver arguments
        Sender_1::sendError(UserError*) --> Receiver::updateStatus(Message*)

QObject::connect: Incompatible sender/receiver arguments
        Sender_2::sendError(UserError*) --> Receiver::updateStatus(Message*)

Я понимаю что дело как раз не в совпадении типов, но хотелось бы поддержки динамического полиформизма
в данном случае, возможно ли что-то сделать?
поможет ли мне допустим boost::signal?
Записан
alexman
Гость
« Ответ #1 : Сентябрь 20, 2011, 20:58 »

Может стоит передавать в кач-ве арг-та Message*?
Записан
Akon
Гость
« Ответ #2 : Сентябрь 20, 2011, 21:00 »

Проблема в MOC - он тупо считает типы Base и DerivedFromBase разными, хотя с точки зрения C++ DerivedFromBase является Base (upcast), поэтому с бустом проблем не будет.
Записан
blood_shadow
Гость
« Ответ #3 : Сентябрь 20, 2011, 21:03 »

Проблема в MOC - он тупо считает типы Base и DerivedFromBase разными, хотя с точки зрения C++ DerivedFromBase является Base (upcast), поэтому с бустом проблем не будет.
ок, ща буду разбираться с бустом, спасибо  Улыбающийся
Записан
blood_shadow
Гость
« Ответ #4 : Сентябрь 20, 2011, 21:04 »

Может стоит передавать в кач-ве арг-та Message*?
та можно... только я организовал красивую иерархию ошибок и сообщений  Строит глазки
Записан
Vass
Гость
« Ответ #5 : Сентябрь 20, 2011, 21:18 »

та можно... только я организовал красивую иерархию ошибок и сообщений  Строит глазки

Так тогда и будет красиво, ваш обработчик и знать не будет какой класс к нему пришел а будет вызывать просто виртуальную ф-цию showMessage()
по-моему как раз пример красоты и изящества полиморфизма.
Записан
Akon
Гость
« Ответ #6 : Сентябрь 20, 2011, 21:44 »

Нихрена - я про пример красоты, изящества и полиморфизма! Тип указывается в сигнале и какому-то клиенту в его обработчике нужен именно этот тип.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 21, 2011, 12:31 »

Почему не просто "невиртувоьный слот вызывает виртуал"? (и при connect привести к базовому типу)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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