Russian Qt Forum

Qt => Вопросы новичков => Тема начата: blood_shadow от Сентябрь 20, 2011, 20:51



Название: Сигналы, слоты и наследование
Отправлено: 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?


Название: Re: Сигналы, слоты и наследование
Отправлено: alexman от Сентябрь 20, 2011, 20:58
Может стоит передавать в кач-ве арг-та Message*?


Название: Re: Сигналы, слоты и наследование
Отправлено: Akon от Сентябрь 20, 2011, 21:00
Проблема в MOC - он тупо считает типы Base и DerivedFromBase разными, хотя с точки зрения C++ DerivedFromBase является Base (upcast), поэтому с бустом проблем не будет.


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


Название: Re: Сигналы, слоты и наследование
Отправлено: blood_shadow от Сентябрь 20, 2011, 21:04
Может стоит передавать в кач-ве арг-та Message*?
та можно... только я организовал красивую иерархию ошибок и сообщений  ::)


Название: Re: Сигналы, слоты и наследование
Отправлено: Vass от Сентябрь 20, 2011, 21:18
та можно... только я организовал красивую иерархию ошибок и сообщений  ::)

Так тогда и будет красиво, ваш обработчик и знать не будет какой класс к нему пришел а будет вызывать просто виртуальную ф-цию showMessage()
по-моему как раз пример красоты и изящества полиморфизма.


Название: Re: Сигналы, слоты и наследование
Отправлено: Akon от Сентябрь 20, 2011, 21:44
Нихрена - я про пример красоты, изящества и полиморфизма! Тип указывается в сигнале и какому-то клиенту в его обработчике нужен именно этот тип.


Название: Re: Сигналы, слоты и наследование
Отправлено: Igors от Сентябрь 21, 2011, 12:31
Почему не просто "невиртувоьный слот вызывает виртуал"? (и при connect привести к базовому типу)