Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2013, 23:41   #1
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
Радость QT - сигналы

Друзья, всем добрый вечер!

Подскажите, пожалуйста.
Имеется 2 класса A и B.
Суть в том что класс B имеет множество объектов.

И сигнал испускаемый из класса А необходимо направлять в нужный объект класса B.

Т.е. если так рассуждать, одним сигналом класса А здесь не обойтись?
Просто получается не совсем красивая последовательность действий.
Что-то вроде:
Код:
QObject::connect(&myA1, SIGNAL(mySignal1(myClass*)), &myB1, SLOT(mySlot(myClass*)));
QObject::connect(&myA1, SIGNAL(mySignal2(myClass*)), &myB2, SLOT(mySlot(myClass*)));
QObject::connect(&myA1, SIGNAL(mySignal3(myClass*)), &myB3, SLOT(mySlot(myClass*)));
Т.е. для того, чтобы передать из объекта класса А информацию myClass* в объект myB1 класса B, нам потребуется сигнал mySignal1(myClass*).
А вот чтобы предать указатель myClass* в объект myB2 того же типа B, уже придется описывать второй сигнал - mySignal2(myClass*).

По сути получается какое-то дублирование кода, а что если у нас будет 100 объектов типа B, и мне необходимо с каждым из них иметь индивидуальное средство связи - придется плодить 100 отдельных сигналов?

Скажите, пожалуйста, если ли какой-нибудь выход из этой ситуации?

Спасибо!
Базиля вне форума Ответить с цитированием
Старый 06.10.2013, 05:15   #2
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Как я понял - Вас пытаються научить использовать это.

Вкратце - в классе А надо организовать событие, которое и вызывать по сигналу. А в классе Б тупо подписыватся на это событие.
simples вне форума Ответить с цитированием
Старый 06.10.2013, 07:33   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Т.е. для того, чтобы передать из объекта класса А информацию myClass* в объект myB1 класса B, нам потребуется сигнал mySignal1(myClass*).
А вот чтобы предать указатель myClass* в объект myB2 того же типа B, уже придется описывать второй сигнал - mySignal2(myClass*).
чето не так. Если ты все правильно описал - ты можешь использовать один сигнал, что мешает?
rrrFer вне форума Ответить с цитированием
Старый 06.10.2013, 12:21   #4
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

simples
Цитата:
Как я понял - Вас пытаються научить использовать это.

Вкратце - в классе А надо организовать событие, которое и вызывать по сигналу. А в классе Б тупо подписыватся на это событие.
Да, про этот паттерн мне рассказывали.
Но ведь сам механизм сигналов и слотов и не есть реализация этого паттерна?

rrrFer
Цитата:
чето не так. Если ты все правильно описал - ты можешь использовать один сигнал, что мешает?
Мне требуется чтобы испускающий сигнал получал именно конкретный объект класса B.
Если я соединю 1 сигнал mySignal со слотом mySlot каждого объекта класса B, то при испускании сигнала, этот сигнал будет получен всеми объектами класса B.
А в моем же случае, к примеру, мне в конкретный момент понадобилось отправить сигнал именно объекту myB2, а через некоторое время объекту myB1.
Т.е. у меня должна быть возможность отправить 5 сигналов объекту myB2 и 1 сигнал (совершенно с другим значением указателя myClass*) объекту myB1

Последний раз редактировалось Базиля; 06.10.2013 в 12:25.
Базиля вне форума Ответить с цитированием
Старый 06.10.2013, 12:39   #5
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Т.е. у меня должна быть возможность отправить 5 сигналов объекту myB2 и 1 сигнал (совершенно с другим значением указателя myClass*) объекту myB1
Тогда это НЕ паттерн "подписка-оповещение".
simples вне форума Ответить с цитированием
Старый 06.10.2013, 12:48   #6
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от simples Посмотреть сообщение
Тогда это НЕ паттерн "подписка-оповещение".
А что это тогда?

Если бы можно было завести массив сигналов, вопросов не было бы, в цикл запихал бы соединение сигналов со слотом каждого объекта.
А так приходится писать такую гадость, причем ее размер зависит напрямую от количество объектов класса B.
Т.е. иного варианта в данной ситуации у меня нет?
Наверное придется тогда отказаться от сигналов и слотов и выбирать иной подход
Базиля вне форума Ответить с цитированием
Старый 06.10.2013, 14:22   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
А в моем же случае, к примеру, мне в конкретный момент понадобилось отправить сигнал именно объекту myB2, а через некоторое время объекту myB1.
Т.е. у меня должна быть возможность отправить 5 сигналов объекту myB2 и 1 сигнал (совершенно с другим значением указателя myClass*) объекту myB1
Почему все так много хотят от компьютера?

Когда ты отправляешь сигнал, его получают все подписчики. Те же хочешь сделать так, чтобы компьютер как-то хитро угадал какому объекту передать сигнал. Так не бывает.

Новые объекты могут появляться во время работы программы, а имена сигналов - нет. Это я об этом примере:
Цитата:
Код:
QObject::connect(&myA1, SIGNAL(mySignal1(myClass*)), &myB1, SLOT(mySlot(myClass*)));
QObject::connect(&myA1, SIGNAL(mySignal2(myClass*)), &myB2, SLOT(mySlot(myClass*)));
QObject::connect(&myA1, SIGNAL(mySignal3(myClass*)), &myB3, SLOT(mySlot(myClass*)));
rrrFer вне форума Ответить с цитированием
Старый 06.10.2013, 14:26   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Ты можешь идентифицировать объекты каким-то образом и в сигнале передавать этот идентификатор.
Сигнал получат все объекты, но те, кому он не адресован - проигнорируют. Я так иногда делаю...например:
Код:
void MenuButton::on_levelComplete(QString &path) {
  if (path != m_path) return;
  setIcon(*new QIcon(":/pics/pictures/check.png"));
}
Но если объектов много - это не лучший вариант (это капец как неоптимально, в моем случае это работает нормально. Кнопок никогда не будет очень много).

Но иначе то, что ты хочешь никак не достижимо (компьютер не может "как то хитро угадывать что бы хочешь")
rrrFer вне форума Ответить с цитированием
Старый 06.10.2013, 14:43   #9
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Благодарю!

Да, я думал просто передавать также id через сигнал, а уже при получении определять к кому именно принадлежит сигнал.
Но в моем случае это действительно не оптимально.
У меня сегодня может быть 10 объектов, а завтра возможно потребуется уже 30 или 40.

Цитата:
Те же хочешь сделать так, чтобы компьютер как-то хитро угадал какому объекту передать сигнал. Так не бывает.
Конечно же нет, я все прекрасно понимаю

Мне просто пришла идея о массиве сигналов (т.е. создавать сигналы динамически), но такой возможности нет

Подумал, что возможно чего-то еще не знаю, поэтому и обратился за помощью
Базиля вне форума Ответить с цитированием
Старый 06.10.2013, 14:50   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

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

Цитата:
У меня сегодня может быть 10 объектов, а завтра возможно потребуется уже 30 или 40.
важно не только количество объектов, а частота возникновения сигналов.
Из примера выше - у меня сигнал получают до 90 кнопочек (но сигнал генерируется очень очень редко - и это работает нормально).

Но в Qt же есть не только коннект, но и дисконект (ты можешь отсоединять сигнал об объектов, которые не должны его получать). Модель сигналов и слотов реализует паттерн паблишер-сабскрайбер, и я думаю, что коннект и дисконект выполняются весьма быстро (думаю за O(log(N)), тут N - количество объектов, получающих сигналы).
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Matlab(сигналы) Tolian92 Помощь студентам 0 03.06.2013 22:33
Сигналы NewMem Помощь студентам 0 26.05.2011 17:18
Сигналы Yelisey Общие вопросы C/C++ 1 08.05.2011 17:54
сигналы в Qt! marselik Qt и кроссплатформенное программирование С/С++ 1 24.11.2010 23:29