Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Цепочка обязанностей


Автор: gpepsi 7.10.2011, 12:48
можно ли как с помощью сигналов/слотов организовать цепочку обязанностей ?

З.Ы. Если у меня есть базовый класс, который имеет сигналы, то наследуются ли они ? Будет ли этот сигнал доступен наследнику ?

Автор: borisbn 7.10.2011, 13:01
Цитата(gpepsi @  7.10.2011,  12:48 Найти цитируемый пост)
цепочку обязанностей

что это ?
не знаю, нужно ли тебе это, но ты можешь коннектить сигнал к другому сигналу, и если на последний законнекчен слот, и ты эмитишь первый, то слот вызовется.

Цитата(gpepsi @  7.10.2011,  12:48 Найти цитируемый пост)
З.Ы. Если у меня есть базовый класс, который имеет сигналы, то наследуются ли они ? Будет ли этот сигнал доступен наследнику ?

Да

Автор: RazrFalcon 7.10.2011, 14:06
Код

connect(main,SIGNAL(signal()),sub,SIGNAL(signal()));
connect(sub,SIGNAL(signal()),sub2,SIGNAL(signal()));
connect(sub2,SIGNAL(signal()),sub3,SIGNAL(signal()));
...

что то такое?

Автор: gpepsi 7.10.2011, 15:00
Цитата(RazrFalcon @  7.10.2011,  14:06 Найти цитируемый пост)
что то такое? 

а их обработка обработчиками где будет происходить ? 

Автор: math64 7.10.2011, 15:31
Цитата(gpepsi @  7.10.2011,  15:00 Найти цитируемый пост)
а их обработка обработчиками где будет происходить ?

Последний в цепочке - слот, он и обрабатывает.
Например, на главной форме есть виджет редактора, и она соединяет свой слот с сигналом редактора об изменении текста.
Редактор загружает документ и соединяет слот изменения документа со своим сигналом. Если бы у редактора не было сигнала об изменении документа, пришлось бы каждый раз при открытии документов делать пересоединение слотов.
Но не совсем продумано, как определить источник сигнала - в многодокументном интерфейсе может быть несколько редакторов и документов.

Автор: gpepsi 7.10.2011, 18:46
Цитата(math64 @  7.10.2011,  15:31 Найти цитируемый пост)
Последний в цепочке - слот, он и обрабатывает.

не - все обработчики должны иметь возможность обработать - иначе можно просто соединить первый с последним,
что будет тоже самое

Автор: RazrFalcon 7.10.2011, 21:12
Ну тогда слот должен в конце запускать следующий слот.
Код

{
...
emit nextSlot();
}

Автор: gpepsi 7.10.2011, 21:21
Цитата(RazrFalcon @  7.10.2011,  21:12 Найти цитируемый пост)
Ну тогда слот должен в конце запускать следующий слот.

получается тогда 

Код

template <class T> class IHandler : public QObject {
    Q_OBJECT
public :
    virtual ~IHandler () = 0  {}

public slots:
    virtual void parse(T value)
    {
        // делаем свои грязные дела
        emit next(value);
    }

signals:
    void next(T value);
    
};


так что-ли ?

Автор: math64 7.10.2011, 21:47
Цитата(gpepsi @  7.10.2011,  18:46 Найти цитируемый пост)
не - все обработчики должны иметь возможность обработать - иначе можно просто соединить первый с последним

Не то же самое. Ты не внимательно читал моё сообщение:
Обработка событий идёт по пути:
документ->редактор->главное окно
Выбрали новый документ, теперь путь изменился:
документ2->редактор->главное окно
Главному окну не нужно делать пересоединение (а соединений редактор->главное окно может быть несколько), редактор присоединился к новому документу, и события теперь идут от него.
Документ, от которого пришло событие, можно определить так:
Код

ui->editor->document();

Но это только потому, что мы знаем, что стрелочник - редактор, и спрашиваем у него куда он перевел стрелку.

Добавлено через 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,  вопрос можно свести к следующему:
  можно ли подключить к сигналу несколько слотов различных объектов, и ответ станет очевидным.. smile
а можно ли это, предлагаю Вам самим поискать в документации  smile 
 

Автор: gpepsi 8.10.2011, 12:41
Цитата(mes @  8.10.2011,  10:09 Найти цитируемый пост)
gpepsi,  вопрос можно свести к следующему:
  можно ли подключить к сигналу несколько слотов различных объектов, и ответ станет очевидным.. smile
а можно ли это, предлагаю Вам самим поискать в документации 

нет - тут подключение не к одному объекту нескольких слотов, а именно цепочка обязанностей.

Каждый предыдущий обработчик может изменить данные для последующего. Поэтому важна последовательность подключения.
Можно конечно для каждого объекта создавать сигнал и слот, но хотелось бы это оптимизировать (например наследованием)
чтоб они создавались автоматически.

В идеале бы использовать traits-ы, чтоб в эту цепочку нельзя было всунуть объект не удовлетворяющий условиям.
А обработчики бы в конструкторе сами подключали бы нужные слоты

Автор: math64 8.10.2011, 17:06
gpepsi
Обычно сигнал эмитируется при обработке события. Вместо использования сигнала можешь создать производный класс и в нём переопределить обработчик события - так быстрее, но для каждого аналогичного изменения поведения в разных объектах нужно писать новый класс.
Можно написать фильтр событий - один и тот же фильтр можно использовать в разных объектах, но там общий обработчик на все типы событий и нужно сначала определить тип события.
Ну и можно пользоваться сигналами и слотами, тут даже не надо знать типы источника сигнала и обработчика слота, нужно знать только их имена и два объекта, имеющие в дереве наследовния только один общий предок - QObject, но имеющие одинаковые слоты, могу заменять друг друга при connect'е (при обычном прогрмаммировании они должны бы были иметь общего предка с виртуальным методом вместо слота).
Какой вариант лучше задавай конкрентый вопрос, в каждом конкрентом случае ответ будет свой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)