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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: послать данные вместе с QEvent  (Прочитано 6953 раз)
QCasper
Гость
« : Август 17, 2006, 09:49 »

можно ли как-то вместе с отправкой события например sendEvent или postEvent послать еще и какие-то значимые данные, например строку?
Записан
bigirbis
Гость
« Ответ #1 : Август 17, 2006, 09:54 »

Пронаследуйся от QEvent, а дальше - все что твоей душе угодно. Единственное, ловить придется через eventFilter. Либо извратиться и пронаследоваться от какого-нибудь готового Event.
Записан
QCasper
Гость
« Ответ #2 : Август 17, 2006, 09:56 »

Цитата: "bigirbis"
Пронаследуйся от QEvent, а дальше - все что твоей душе угодно. Единственное, ловить придется через eventFilter. Либо извратиться и пронаследоваться от какого-нибудь готового Event.


я не совсем понимаю, кого именно наследовать от QEvent, и что потом куда посылать, можно маленький примерчик?
Записан
bigirbis
Гость
« Ответ #3 : Август 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();
Записан
noosooth
Гость
« Ответ #4 : Август 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();
}
   
Записан
QCasper
Гость
« Ответ #5 : Август 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
Записан
noosooth
Гость
« Ответ #6 : Август 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, а приложение ею пользующееся без оной.
Записан
QCasper
Гость
« Ответ #7 : Август 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 ничего, честно говоря, сказать не могу
Записан
Steven_Orko
Гость
« Ответ #8 : Август 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.
Записан
QCasper
Гость
« Ответ #9 : Август 17, 2006, 16:21 »

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


я кстати об обжект касте тоже подумал, но сначала почему-то решил сделать в старом стиле, а в чем заключаются минусы того, что я так и оставлю?
Записан
noosooth
Гость
« Ответ #10 : Август 17, 2006, 17:34 »

Цитата: "Steven_Orko"

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


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

А класс QEvent, насколько я понимаю, не есть потомок QObject. Соответственно qobject_cast() в данном случае не пройдет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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