Russian Qt Forum

Qt => Общие вопросы => Тема начата: QCasper от Август 17, 2006, 09:49



Название: послать данные вместе с QEvent
Отправлено: QCasper от Август 17, 2006, 09:49
можно ли как-то вместе с отправкой события например sendEvent или postEvent послать еще и какие-то значимые данные, например строку?


Название: послать данные вместе с QEvent
Отправлено: bigirbis от Август 17, 2006, 09:54
Пронаследуйся от QEvent, а дальше - все что твоей душе угодно. Единственное, ловить придется через eventFilter. Либо извратиться и пронаследоваться от какого-нибудь готового Event.


Название: послать данные вместе с QEvent
Отправлено: QCasper от Август 17, 2006, 09:56
Цитата: "bigirbis"
Пронаследуйся от QEvent, а дальше - все что твоей душе угодно. Единственное, ловить придется через eventFilter. Либо извратиться и пронаследоваться от какого-нибудь готового Event.


я не совсем понимаю, кого именно наследовать от QEvent, и что потом куда посылать, можно маленький примерчик?


Название: послать данные вместе с QEvent
Отправлено: bigirbis от Август 17, 2006, 10:10
Код:
class MyEvent : public QEvent
{
public:
 MyEvent( const QString & str ) : str_( str ) {};
 QString str() { return str_; };
private:
 QString str_;
};
Код:

MyEvent * event = new MyEvent ( "string" );
QCoreApplication::sendEvent ( someObject, event );

Код:

MyEvent * event = dynamic_cast < MyEvent * > ( ev );
if( event )
 event->str();


Название: послать данные вместе с QEvent
Отправлено: noosooth от Август 17, 2006, 13:26
Цитата: "QCasper"
я не совсем понимаю, кого именно наследовать от QEvent, и что потом куда посылать, можно маленький примерчик?


Думаю можно ещё вот так ловить:

Код:
class MyEvent : public QEvent
{
public:
 MyEvent(int type, const QString& s) : QEvent(static_cast<Type>(type)), s(s) {};
 const QString& str() { return s; };
private:
 QString s;
};


Там откуда посылаете:
Код:

myEvent e(QEvent::User + 1, "bla-bla-bla");
QCoreApplication::sendEvent(Receiver, &e);


А в классе "Receiver"  переопределить ф-цию
void customEvent (QEvent* event ), которая по идее будет вызываться
ежели классу пришел "custom event", т.е. event c типом больше чем QEvent::User.


Код:
void Receiver::customEvent(QEvent* e) 
{
   MyEvent* event = dynamic_cast<MyEvent*>(e);
   if(event)
      QString s = event->str();
}
   


Название: послать данные вместе с QEvent
Отправлено: QCasper от Август 17, 2006, 14:49
я пытаюсь поймать в customEvent это событие.
на строку

Код:
CSISEvent *me = dynamic_cast<CSISEvent*>(e);


компилятор выбрасывает
warning C4541: 'dynamic_cast' used on polymorphic type 'QEvent' with /GR-; unpredictable behavior may result

и когда дело доходит до выполнения этой строки я получаю access violation


Название: послать данные вместе с QEvent
Отправлено: noosooth от Август 17, 2006, 15:06
Цитата: "QCasper"

компилятор выбрасывает
warning C4541: 'dynamic_cast' used on polymorphic type 'QEvent' with /GR-; unpredictable behavior may result


Дык либо включите RTTI (/GR).

Либо разгребайте тип ручками.
Что нибудь вроде:
Код:

void Receiver::customEvent(QEvent* e)
{
   if(e->type()==QEvent::User+1)
   {
      MyEvent* me = static_cast<MyEvent*>(e);
      QString s = me->str();
   }
   
}


Кстати, Qt у Вас с поддержкой RTTI собран?
А то я так сходу не могу сообразить какие проблемы могут возникнуть если библиотека собрана с поддержкой RTTI, а приложение ею пользующееся без оной.


Название: послать данные вместе с QEvent
Отправлено: QCasper от Август 17, 2006, 15:42
Цитата: "noosooth"
Цитата: "QCasper"

компилятор выбрасывает
warning C4541: 'dynamic_cast' used on polymorphic type 'QEvent' with /GR-; unpredictable behavior may result


Дык либо включите RTTI (/GR).

Либо разгребайте тип ручками.
Что нибудь вроде:
Код:

void Receiver::customEvent(QEvent* e)
{
   if(e->type()==QEvent::User+1)
   {
      MyEvent* me = static_cast<MyEvent*>(e);
      QString s = me->str();
   }
   
}


Кстати, Qt у Вас с поддержкой RTTI собран?
А то я так сходу не могу сообразить какие проблемы могут возникнуть если библиотека собрана с поддержкой RTTI, а приложение ею пользующееся без оной.


я в итоге решил проблему в старом стиле:

Код:
CSISEvent *me = (CSISEvent*)e;


а насчет RTTI ничего, честно говоря, сказать не могу


Название: послать данные вместе с QEvent
Отправлено: Steven_Orko от Август 17, 2006, 15:59
Цитата: "QCasper"
я пытаюсь поймать в customEvent это событие.
на строку

Код:
CSISEvent *me = dynamic_cast<CSISEvent*>(e);


компилятор выбрасывает
warning C4541: 'dynamic_cast' used on polymorphic type 'QEvent' with /GR-; unpredictable behavior may result

и когда дело доходит до выполнения этой строки я получаю access violation


Добавьте эту опцию, что говорит компилятор.
Вообще для таких преобразований классов Qt и их потомков тролли придумали специальный макрос qobject_cast.


Название: послать данные вместе с QEvent
Отправлено: QCasper от Август 17, 2006, 16:21
Цитата: "Steven_Orko"
Добавьте эту опцию, что говорит компилятор.
Вообще для таких преобразований классов Qt и их потомков тролли придумали специальный макрос qobject_cast.


я кстати об обжект касте тоже подумал, но сначала почему-то решил сделать в старом стиле, а в чем заключаются минусы того, что я так и оставлю?


Название: послать данные вместе с QEvent
Отправлено: noosooth от Август 17, 2006, 17:34
Цитата: "Steven_Orko"

Вообще для таких преобразований классов Qt и их потомков тролли придумали специальный макрос qobject_cast.


Вообще T qobject_cast ( QObject * object ) -  это функция, а не макрос.

А класс QEvent, насколько я понимаю, не есть потомок QObject. Соответственно qobject_cast() в данном случае не пройдет.