Название: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: kuzulis от Апрель 26, 2011, 11:01 Доброго времени суток.
У меня возникла идея реализовать (пока только под Win) свой класс (диспетчер) для отлова событий от последовательного порта и передачи их в цикл обработки приложения. Т.е. сам класс - диспетчер WinSerialEventDispatcher наследуется от QThread и в своем методе run() обрабатывает дескрипторы портов и при возникновении каких-то событий, формирует свой евент SerialEvent , наследуемый от QEvent и методом QCoreApplication::postEvent() шлет этот евент приемнику. Приемником в данном случае выступает QApplication. В приложении QApplication имею виджет в котором переопределяю метод QWidget::event() в котором перехватываю и, если надо, обрабатываю нужное пришедшее событие. Т.е. имеется две сущности: 1. Генератор событий: диспетчер, WinSerialEventDispatcher который формирует и рассылает евенты от последовательных портов 2. Приемник событий: само приложение QApplication, которое их обрабатывает. Так вот, проблема в том, что мои евенты не доходят куда надо. Естественно, код в WinSerialEventDispatcher::run() работает верно. 1. Вот класс моего события (от последовательного порта) Код
2. Вот код метода run() Код
3. Далее, в приложении есть виджет в котором переопределен метод event() Код
Так вот, дебаг сообщение не выводится. Что я делаю не так? :-\ Название: Re: QCoreApplication::postEvent из QThread::run() Отправлено: kuzulis от Апрель 26, 2011, 11:37 И так не работает:
Код
:-\ Название: Re: QCoreApplication::postEvent из QThread::run() Отправлено: GreatSnake от Апрель 26, 2011, 12:36 Ну дык, ты шлёшь событие в qApp:
Код а слушаешь его в своём виджете: Код QCoreApplication просто так бродкастить такие события всем не будет. Название: Re: QCoreApplication::postEvent из QThread::run() Отправлено: Akon от Апрель 26, 2011, 12:38 А зачем клиентскому коду какие-то события. Удобнее всего работать с сигналами.
Название: Re: QCoreApplication::postEvent из QThread::run() Отправлено: GreatSnake от Апрель 26, 2011, 12:41 Цитата: Akon А зачем клиентскому коду какие-то события. Удобнее всего работать с сигналами. А какая разница? Суть-то одна.Название: Re: QCoreApplication::postEvent из QThread::run() Отправлено: kuzulis от Апрель 26, 2011, 12:53 Цитировать QCoreApplication просто так бродкастить такие события всем не будет. Так я пробовал переопределять метод eventFilter() и устанавливать его installEventFilter(qApp) но ничего не работает все-равно.Я так понимаю, что вызвав myWidget->installEventFilter(qApp) я для моего виджета добавляю обработку событий от самого QApplication, т.е. фильтрую и события от QApplication?! Но не работает. Просто я задумывал так, что класс - диспетчер ничего не должен знать о том, кому именно он рассылает события! (Т.е. знает только одного приемника - QApplication) . А вот QApplication уже может иметь туеву хучу экземпляров классов типа TestWidget, каждый из которых нуждается в своем типе пользовательского события от последовательного устройства. Т.е. в идеале нужно сделать так, чтобы можно было в любом подобъекте (классе) приложения переопределив методы: event(), customEvent() и т.п. поимать события от диспетчера. ----- Тьфу ты, проблема решена: нужно делать не: Код а Код
:) Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: GreatSnake от Апрель 26, 2011, 13:07 Цитировать Я так понимаю, что вызвав myWidget->installEventFilter(qApp) я для моего виджета добавляю обработку событий от самого QApplication, Всё наоборот ;)т.е. фильтрую и события от QApplication?! Но не работает. Код
Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: asvil от Апрель 26, 2011, 14:50 Соотвественно вопрос. Как броадкастить?
Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: kuzulis от Апрель 26, 2011, 16:15 Соотвественно вопрос. Как броадкастить? В смысле?Для тех объектов которым нужны евенты делаем: Код
Как то так... Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: asvil от Апрель 26, 2011, 16:33 А как QEvent::LanguageChanged всем передается?
А вот как Код: qApp.installTranslator() { Функции вызывается в перечисленном порядке. Как аналогично забродкастить событие? Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: GreatSnake от Апрель 26, 2011, 17:23 С виджетами всё просто - берёшь QApplication::allWidgets() и каждому постишь событие.
А тебе-то надо каждому объекту. Непонятно только зачем каждому. Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: asvil от Апрель 26, 2011, 17:28 Да, каждому-таки не нужно. Событие Database connection changed, его должны отловить только заинтересованные объекты. Не хотелось фильтр инсталлировать. Хотелось сразу только changeEvent переопределять.
Название: Re: [решено]QCoreApplication::postEvent из QThread::run() Отправлено: GreatSnake от Апрель 26, 2011, 17:32 Ну дык и используй сигналы для этого. Имхо, намного проще будет.
|