Russian Qt Forum
Октябрь 01, 2024, 22:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?  (Прочитано 8832 раз)
Valter
Гость
« : Январь 17, 2013, 12:48 »

Т.е. для сигналов без параметров всё понятно:
pSignalMapper = new QSignalMapper(this);
connect(ui.myButton, SIGNAL(clicked(), pSignalMapper, SLOT(map()));
pSignalMapper->setMapping(ui.myButton, 0);
connect(pSignalMapper, SIGNAL(mapped(int)), this, SLOT(MySlot(int))).

А если нужно обрабатывать слот valueChanged(int value) компонента QSlider, то как передать этот value через QSignalMapper?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Январь 17, 2013, 13:06 »

connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotWithParam(int))) или я чего-то не понял
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Valter
Гость
« Ответ #2 : Январь 17, 2013, 13:28 »

connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotWithParam(int))) или я чего-то не понял

Дык это для одного слайдера. А если их куча? и делают одно и то же с разницей в одном параметре. Вот и хотелось бы с помощью QSignalMapper передать 1. идентификатор слайдера; 2. новое значение ползунка.
Вопрос даже шире. Вообще, можно ли с помощью QSignalMapper передавать собственные параметры сигналов?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Январь 17, 2013, 14:18 »

если куча, то циклом — сигнал-то у всех один и тот же. или у тебя слайдеры посылают один и тот же сигнал, но с разными параметрами, например valueChanged(int) и valueChanged(double)?

можно вместо числа сам объект маппить.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lighting
Гость
« Ответ #4 : Январь 17, 2013, 14:22 »

Дык это для одного слайдера. А если их куча? и делают одно и то же с разницей в одном параметре.
Используй sender() в теле слота вместо signalMapper чтобы узнать кто именно сигнал испустил.
« Последнее редактирование: Январь 17, 2013, 14:24 от lighting » Записан
Valter
Гость
« Ответ #5 : Январь 17, 2013, 15:45 »

Если маппить сам объект или получать его в теле слота (sender()), то получается что для того чтоб понять какой объект испустил сигнал нужен большой switch по количеству объектов. Хотя и switch не получится, ведь имя объекта это строка, а куча слайдеров в моём случае отличаются только именем. Кучу ифов нагородить? А задача-то всего лишь в слоте поставить в соответствие объекту целое число.
Записан
Bepec
Гость
« Ответ #6 : Январь 17, 2013, 16:51 »

Нафига козе баян?

строка не помогает?
Код:
if (sender())->objectName().contains("slider"))
   //code
Записан
lighting
Гость
« Ответ #7 : Январь 18, 2013, 16:29 »

Нафига козе баян?

строка не помогает?
Код:
if (sender())->objectName().contains("slider"))
   //code
Она возможно и поможет, но вообще-то это не очень правильное решение - имя слайдера может и не содержать строки "slider".
Valter что мешает тебе сделать sender()->setValue(val);
Ну или опиши подробнее что именно тебе нужно.
Записан
Bepec
Гость
« Ответ #8 : Январь 18, 2013, 16:48 »

to lighting: Я искренне верю, что все программисты придерживаются правила аля "типЭлементаИнтерфейса_егоНазначение".

Хотя встречал пару проектов, где была кнопка названа - editNameLine.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Январь 18, 2013, 16:57 »

Если маппить сам объект или получать его в теле слота (sender()), то получается что для того чтоб понять какой объект испустил сигнал нужен большой switch по количеству объектов. Хотя и switch не получится, ведь имя объекта это строка, а куча слайдеров в моём случае отличаются только именем. Кучу ифов нагородить? А задача-то всего лишь в слоте поставить в соответствие объекту целое число.

Простота поставленной задачи не всегда превращается в простое решение.
Записан
Bepec
Гость
« Ответ #10 : Январь 18, 2013, 17:06 »

Перечитал тему - не понял в чём смысл повествования.

Вопрос решается одним проходом по массиву слайдеров и коннектом их к одному слоту.
Если уж так вот западло по одному их подключать при создании.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #11 : Январь 18, 2013, 21:10 »

Сохраните свои значения в слайдерах (QObject::setProperty).
Потом в слоте читайте sender()->property( "myPropertyName" ).toInt();
Записан
Valter
Гость
« Ответ #12 : Январь 22, 2013, 12:38 »

Ну или опиши подробнее что именно тебе нужно.

Нужно узнать ползунок какого из N слайдеров двинул пользователь, при этом получить новое значение ползунка слайдера. При этом хотелось бы получить не указатель на слайдер, а идентификатор (от 0 до N-1). Т.е хотелось бы передать параметр int value сигнала valueChanged(int value) всех слайдеров в один единственный слот, в котором этот идентификатор будет использован как параметр в готовом виде.
Напрашивается решение через QSignalMapper, позволяющий ввести идентификатор, но тогда как передать параметр сигнала?
Если тупо насоединять сигналы valueChanged(int value) со слотом, то отправителя определять только по номеру содержащемуся в имени объекта (ну это же некрасиво).
Записан
Bepec
Гость
« Ответ #13 : Январь 22, 2013, 12:53 »

Почему некрасиво? У тебя идентификатор в любом случае будет в программе. В любом случае тебе надо будет его задавать. А беря его из имени ты как раз и реализуешь эту часть.

Не понимаю, что некрасивого... Сигналы идут на QString'гах, слоты идут на QString'ах, а вот фигачить идентификатор на QString'е плохо.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #14 : Январь 22, 2013, 13:57 »

По совету LisandreL, работать через property и sender(). Необходимо только понимать, что в момент обработки сигнала sender() может уже и не существовать.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.