Название: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 21, 2012, 18:56 Привет всем. Возникла такая задачка:
Есть объект Controller, он может генерить некоторое событие. Есть много объектов CustomAction, которые должны принимать это событие. Есть обект Proxy, через которые Controller связан с CustomAction посредством агрегации. Т.е. Controller и CustomActionы хранят в себе указатель на Proxy. Вот что представляет собой мое событие Код: class RAILCORESHARED_EXPORT CAbstractEvent : public QEvent Что нужно: при создании события указать в destination текстовую строку(или строки)-описатель, по которому можно найти нужный CSceneAction. Как сейчас сделано: Код: bool CMVCEventProxy::event(QEvent *e) Т.е. я ловлю событие, и перенапрвляю его уже в нужный CSceneAction. Как я и догадывался, такая фишка не прокатывает - сегментация. Подскажите, как правильно такое сделать? Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 21, 2012, 18:58 Как генерится событие в контроллере
Код: ... Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Igors от Ноябрь 21, 2012, 19:33 Ну шансы на "конкретный" ответ здесь невелики - слишком много специфики проекта, которую никто кроме Вас не знает. Поэтому "взагалi"
- вызывающе выглядят static_cast как впрочем и выборки из хеша - не смущает ли Вас что событийный механизм используется для целей далеких от UI? Конечно это не запрещено, но по-взрослому надо строить граф зависимостей, проверять его на зацикливание, а потом процессировать. Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Bepec от Ноябрь 21, 2012, 19:58 Я бы сказал проще - у вас сложный довольно проект для понимания.
Вы сыпете кодом, в котором всё понятно только (ну и тем, кто работает с вами) разработчикам сего чуда :) Локализуйте проблему. Сделайте лёгкий пример без лишней мутотени с заглушками на ожидаемом результате. Выложите сие творение. (именно в такой последовательности) Я вот лично не поручусь, что сегментация идёт в Qt, а не в ваших чудодействиях. Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Igors от Ноябрь 21, 2012, 20:19 Локализуйте проблему. Сделайте лёгкий пример без лишней мутотени с заглушками на ожидаемом результате. Выложите сие творение. (именно в такой последовательности) Fregloin, не поймали ли Вы себя на мысли что это нереально? Впрочем как и для многих моих проектов :) Не все вещи должны быть просты и очевидны, это нормально. Но все же когда нельзя изложить примитивно - это плохо, тревожный "симптом". Мне кажется Вы увлеклись "логикой интерпретирования", ну максимальная гибкость и все такое. Как человек в свое время работавший на AutoLisp соглашусь - это красиво. Но в то же время мой личный опыт показал - только неск процентов из заложенных возможностей будут использованы.А вот отсутствие жесткой типизации колет довольно больно :)Название: Re: Как передавать событие QEvent через несколько & Отправлено: _OLEGator_ от Ноябрь 21, 2012, 20:50 Помоему, если я не ошибаюсь, надо создавать новое событие, а точнее для каждого объекта свое событие. Так действует стандартный механизм Qt - он удаляет объект QEvent.
Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Bepec от Ноябрь 21, 2012, 21:14 to Igors - поправьте своё сообщение и смените объект претензии на меня :)
Нет, не поймал себя на мысли. Насколько я вижу, тут используются самописные классы в размере 2 штук, которые хзчто делают и являются чёрными ящиками. Проблема же в передаче сообщения дальше. Убираем чёрные ящики, убираем разделение, получаем простейший пример. Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 22, 2012, 12:28 Перефразирую первый пост по другому:
Есть несколько классов объектов, которые должны посылать друг другу сообщения. Объекты этих классов напрмямую не связаны между собой. При том, при смене режима работы, одни объекты могут выгружаться, другие загружаться посредством dll. У каждого из этих объектов есть свой tag - просто строка определенного формата. По сути что нужно: "подписать" по тегам эти объекты в некоторый общий диспетчер своих событий. В определенный момент времени (смена состояния например) один из объектов говорит, что нужно по такому то предполагаемому тегу отправить сообщение. Сообщение шлётся в диспетчер. Диспетчер смотрит, если у него объект с таким тегом, и если есть, перенаправялет это событие адресату (адресат и отправитель могут быть как одного класса, так и разных, не связанных между собой). Надеюсь доходчиво написал. Что то подобное есть в iOS, когда можно слать нотификации объектам с определенным тегом. Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Bepec от Ноябрь 22, 2012, 13:05 Вы описали простейший диспетчер. Который в качестве идентификаторы использует tag.
Помоему гораздо проще писать функции с процедурой обработки своих евентов (1 функция с обработкой), чем издеваться над QEvent. Или у вас есть какие то аргументы за и против? Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 22, 2012, 13:49 Я уже понял что QEvent здесь не особо применим, поэтому решил написать свой диспетчер, чем и занялся.
Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 22, 2012, 14:12 Вот что набросал:
Интерфейс моего кастомного события Код: #include <QString> Код: #include "cabstracteventinterface.h" вот сам прокси Код: #include <QObject> Код: #include "cmvceventproxy.h" вот как шлю событие Код: if(manevrWasChanged && !lightObject->manevrDestination().isEmpty()) и принимаю в нужном месте Код: void CSetupRouteAction::acceptEvent(CAbstractEvent *event) Это набросал по быстрому, но думаю что есть что усовершенствовать. Моежт будут какие то советы? Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 22, 2012, 14:16 Такой механизм работает, но во первых, только в одном потоке, и есть смущения по поводу удаления event.
Может его обернуть в QSharedPointer? что бы был подсчёт ссылок, ну и сделать передачу событий асинхронной (пока получается блокирование на acceptEvent)... Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Bepec от Ноябрь 22, 2012, 14:24 Я бы на вашем месте не городил кучу кода и прочего. (я специфики конечно вашей незнаю)
Сделал бы структурку одну штуку. Сделал бы диспетчер с функциями (подписаться, отписаться, переслать событие). Эм... ну и всё в принципе. PS вы выкладываете много кода. Это конечно хорошо. Но вы его обрезаете, названия файлов не даёте, комментариев по коду не видно... Лучше не выкладывайте) Редкий форумчанин будет разбираться в каше :) Название: Re: Как передавать событие QEvent через несколько объектов? Отправлено: Fregloin от Ноябрь 23, 2012, 10:42 Да пожалуй Вы правы. Писалось на эмоциях ).
|