Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цепочка обязанностей 
:(
    Опции темы
gpepsi
Дата 7.10.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



можно ли как с помощью сигналов/слотов организовать цепочку обязанностей ?

З.Ы. Если у меня есть базовый класс, который имеет сигналы, то наследуются ли они ? Будет ли этот сигнал доступен наследнику ?
PM MAIL   Вверх
borisbn
Дата 7.10.2011, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

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

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

Да


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RazrFalcon
Дата 7.10.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.7.2009

Репутация: 1
Всего: 1



Код

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

что то такое?
PM MAIL   Вверх
gpepsi
Дата 7.10.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



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

а их обработка обработчиками где будет происходить ? 
PM MAIL   Вверх
math64
Дата 7.10.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



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

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

Это сообщение отредактировал(а) math64 - 7.10.2011, 15:39
PM   Вверх
gpepsi
Дата 7.10.2011, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



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

не - все обработчики должны иметь возможность обработать - иначе можно просто соединить первый с последним,
что будет тоже самое
PM MAIL   Вверх
RazrFalcon
Дата 7.10.2011, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 29.7.2009

Репутация: 1
Всего: 1



Ну тогда слот должен в конце запускать следующий слот.
Код

{
...
emit nextSlot();
}

PM MAIL   Вверх
gpepsi
Дата 7.10.2011, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(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);
    
};


так что-ли ?

Это сообщение отредактировал(а) gpepsi - 8.10.2011, 07:52
PM MAIL   Вверх
math64
Дата 7.10.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



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

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

ui->editor->document();

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

Добавлено через 14 минут и 50 секунд
по коду из твоего предыдущего сообщения: хотя виртуальные слоты вроде как не запрещены, обычно так не делают, а из слота выполняют обычную виртуальную функцию.
Такие хандлеры иногда приходится писать, чтобы контролировать путь сигнала - иногда у "стрелочника" нельзя узнать, куда переведена стрелка.   
PM   Вверх
gpepsi
Дата 7.10.2011, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



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

З.Ы, Я описал базовый класс для обработчиков, только вот кроме него больше от QObject не унаследоваться, иначе множественное наследование

Это сообщение отредактировал(а) gpepsi - 8.10.2011, 07:52
PM MAIL   Вверх
borisbn
Дата 8.10.2011, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



gpepsi, посмотри в сторону http://developer.qt.nokia.com/doc/qt-4.7/s...achine-api.html


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 8.10.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



удалено автором.

Это сообщение отредактировал(а) boostcoder - 8.10.2011, 09:32
PM WWW   Вверх
mes
Дата 8.10.2011, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



gpepsi,  вопрос можно свести к следующему:
  можно ли подключить к сигналу несколько слотов различных объектов, и ответ станет очевидным.. smile
а можно ли это, предлагаю Вам самим поискать в документации  smile 
 


--------------------
PM MAIL WWW   Вверх
gpepsi
Дата 8.10.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



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

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

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

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

PM MAIL   Вверх
math64
Дата 8.10.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



gpepsi
Обычно сигнал эмитируется при обработке события. Вместо использования сигнала можешь создать производный класс и в нём переопределить обработчик события - так быстрее, но для каждого аналогичного изменения поведения в разных объектах нужно писать новый класс.
Можно написать фильтр событий - один и тот же фильтр можно использовать в разных объектах, но там общий обработчик на все типы событий и нужно сначала определить тип события.
Ну и можно пользоваться сигналами и слотами, тут даже не надо знать типы источника сигнала и обработчика слота, нужно знать только их имена и два объекта, имеющие в дереве наследовния только один общий предок - QObject, но имеющие одинаковые слоты, могу заменять друг друга при connect'е (при обычном прогрмаммировании они должны бы были иметь общего предка с виртуальным методом вместо слота).
Какой вариант лучше задавай конкрентый вопрос, в каждом конкрентом случае ответ будет свой.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.