| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Цепочка обязанностей |
| Автор: gpepsi 7.10.2011, 12:48 |
| можно ли как с помощью сигналов/слотов организовать цепочку обязанностей ? З.Ы. Если у меня есть базовый класс, который имеет сигналы, то наследуются ли они ? Будет ли этот сигнал доступен наследнику ? |
| Автор: RazrFalcon 7.10.2011, 14:06 | ||
что то такое? |
| Автор: gpepsi 7.10.2011, 15:00 |
а их обработка обработчиками где будет происходить ? |
| Автор: math64 7.10.2011, 15:31 |
Последний в цепочке - слот, он и обрабатывает. Например, на главной форме есть виджет редактора, и она соединяет свой слот с сигналом редактора об изменении текста. Редактор загружает документ и соединяет слот изменения документа со своим сигналом. Если бы у редактора не было сигнала об изменении документа, пришлось бы каждый раз при открытии документов делать пересоединение слотов. Но не совсем продумано, как определить источник сигнала - в многодокументном интерфейсе может быть несколько редакторов и документов. |
| Автор: gpepsi 7.10.2011, 18:46 |
не - все обработчики должны иметь возможность обработать - иначе можно просто соединить первый с последним, что будет тоже самое |
| Автор: RazrFalcon 7.10.2011, 21:12 | ||
Ну тогда слот должен в конце запускать следующий слот.
|
| Автор: gpepsi 7.10.2011, 21:21 | ||
получается тогда
так что-ли ? |
| Автор: math64 7.10.2011, 21:47 | ||||
Не то же самое. Ты не внимательно читал моё сообщение: Обработка событий идёт по пути: документ->редактор->главное окно Выбрали новый документ, теперь путь изменился: документ2->редактор->главное окно Главному окну не нужно делать пересоединение (а соединений редактор->главное окно может быть несколько), редактор присоединился к новому документу, и события теперь идут от него. Документ, от которого пришло событие, можно определить так:
Но это только потому, что мы знаем, что стрелочник - редактор, и спрашиваем у него куда он перевел стрелку. Добавлено через 14 минут и 50 секунд по коду из твоего предыдущего сообщения: хотя виртуальные слоты вроде как не запрещены, обычно так не делают, а из слота выполняют обычную виртуальную функцию. Такие хандлеры иногда приходится писать, чтобы контролировать путь сигнала - иногда у "стрелочника" нельзя узнать, куда переведена стрелка. |
| Автор: gpepsi 7.10.2011, 23:00 |
| math64, ты что-то замутил. Нужно просто передать данные по цепочке. Каждый в цепочке может обработать данные. З.Ы, Я описал базовый класс для обработчиков, только вот кроме него больше от QObject не унаследоваться, иначе множественное наследование |
| Автор: borisbn 8.10.2011, 08:45 |
| gpepsi, посмотри в сторону http://developer.qt.nokia.com/doc/qt-4.7/statemachine-api.html |
| Автор: boostcoder 8.10.2011, 09:20 |
| удалено автором. |
| Автор: mes 8.10.2011, 10:09 |
| gpepsi, вопрос можно свести к следующему: можно ли подключить к сигналу несколько слотов различных объектов, и ответ станет очевидным.. а можно ли это, предлагаю Вам самим поискать в документации |
| Автор: gpepsi 8.10.2011, 12:41 | ||
нет - тут подключение не к одному объекту нескольких слотов, а именно цепочка обязанностей. Каждый предыдущий обработчик может изменить данные для последующего. Поэтому важна последовательность подключения. Можно конечно для каждого объекта создавать сигнал и слот, но хотелось бы это оптимизировать (например наследованием) чтоб они создавались автоматически. В идеале бы использовать traits-ы, чтоб в эту цепочку нельзя было всунуть объект не удовлетворяющий условиям. А обработчики бы в конструкторе сами подключали бы нужные слоты |
| Автор: math64 8.10.2011, 17:06 |
| gpepsi Обычно сигнал эмитируется при обработке события. Вместо использования сигнала можешь создать производный класс и в нём переопределить обработчик события - так быстрее, но для каждого аналогичного изменения поведения в разных объектах нужно писать новый класс. Можно написать фильтр событий - один и тот же фильтр можно использовать в разных объектах, но там общий обработчик на все типы событий и нужно сначала определить тип события. Ну и можно пользоваться сигналами и слотами, тут даже не надо знать типы источника сигнала и обработчика слота, нужно знать только их имена и два объекта, имеющие в дереве наследовния только один общий предок - QObject, но имеющие одинаковые слоты, могу заменять друг друга при connect'е (при обычном прогрмаммировании они должны бы были иметь общего предка с виртуальным методом вместо слота). Какой вариант лучше задавай конкрентый вопрос, в каждом конкрентом случае ответ будет свой. |