Доброго времени суток.
У меня возникла идея реализовать (пока только под Win) свой класс (диспетчер) для отлова событий от последовательного порта и передачи их в цикл обработки приложения.
Т.е. сам класс - диспетчер WinSerialEventDispatcher наследуется от QThread и в своем методе run() обрабатывает дескрипторы портов и при возникновении каких-то событий,
формирует свой евент SerialEvent , наследуемый от QEvent и методом QCoreApplication::postEvent() шлет этот евент приемнику.
Приемником в данном случае выступает QApplication.
В приложении QApplication имею виджет в котором переопределяю метод QWidget::event() в котором перехватываю и, если надо,
обрабатываю нужное пришедшее событие.
Т.е. имеется две сущности:
1. Генератор событий: диспетчер, WinSerialEventDispatcher который формирует и рассылает евенты от последовательных портов
2. Приемник событий: само приложение QApplication, которое их обрабатывает.
Так вот, проблема в том, что мои евенты не доходят куда надо.
Естественно, код в WinSerialEventDispatcher::run() работает верно.
1. Вот класс моего события (от последовательного порта)
C++ (Qt)
class SerialEvent : public QEvent
{
public:
enum NotifyTypeFlag {
None = 0x00,
Read = 0x01,
Write = 0x02,
Except = 0x04,
Break = 0x08,
Cts = 0x10,
Dsr = 0x20,
Ring = 0x40
};
Q_DECLARE_FLAGS(NotifyType, NotifyTypeFlag)
SerialEvent(NotifyType type, ::HANDLE descriptor)
: QEvent((QEvent::Type)(QEvent::User + 1))
, d(new PrivateData)
{
d->type = type;
d->descriptor = descriptor;
d->cts = false;
d->dsr = false;
d->ring = false;
}
virtual ~SerialEvent()
{
delete d;
}
NotifyType notifyType() const { return d->type; }
::HANDLE descriptor() const { return d->descriptor; }
private:
class PrivateData
{
public:
NotifyType type;
::HANDLE descriptor;
bool cts;
bool dsr;
bool ring;
};
PrivateData *d;
};
2. Вот код метода run()
C++ (Qt)
void WinSerialEventDispatcher::run()
{
...
while (!stopped) {
//бесконечно ожидаем сигнального состояния какого нить дескриптора порта
WaitForSingleObjectEx()
...
//проверяем что за евент и что да дескриптор и т.п. и формируем
//набор битовых масок для последующей идентификации типа события и т.п.
...
//тут создаем наш класс - событие SerialEvent с необходимыми параметрами и отправляем в приложение
SerialEvent *e = new SerialEvent(...);
QCoreApplication::postEvent(qApp, e);
...
}
}
3. Далее, в приложении есть виджет в котором переопределен метод event()
C++ (Qt)
bool TestWidget::event(QEvent *e)
{
bool ret = true;
if (e->type() == (QEvent::User + 1)) {
SerialEvent *se = reinterpret_cast<SerialEvent *>(e);
qDebug() << "TestWidget::event() hook: descriptor: " << se->descriptor()
<< " flags = " << se->notifyType();
}
else
ret = QWidget::event(e);
return ret;
}
Так вот, дебаг сообщение не выводится. Что я делаю не так?