Название: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: 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? Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: kambala от Январь 17, 2013, 13:06 connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotWithParam(int))) или я чего-то не понял
Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Valter от Январь 17, 2013, 13:28 connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotWithParam(int))) или я чего-то не понял Дык это для одного слайдера. А если их куча? и делают одно и то же с разницей в одном параметре. Вот и хотелось бы с помощью QSignalMapper передать 1. идентификатор слайдера; 2. новое значение ползунка. Вопрос даже шире. Вообще, можно ли с помощью QSignalMapper передавать собственные параметры сигналов? Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: kambala от Январь 17, 2013, 14:18 если куча, то циклом — сигнал-то у всех один и тот же. или у тебя слайдеры посылают один и тот же сигнал, но с разными параметрами, например valueChanged(int) и valueChanged(double)?
можно вместо числа сам объект маппить. Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: lighting от Январь 17, 2013, 14:22 Дык это для одного слайдера. А если их куча? и делают одно и то же с разницей в одном параметре. Используй sender() в теле слота вместо signalMapper чтобы узнать кто именно сигнал испустил.Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Valter от Январь 17, 2013, 15:45 Если маппить сам объект или получать его в теле слота (sender()), то получается что для того чтоб понять какой объект испустил сигнал нужен большой switch по количеству объектов. Хотя и switch не получится, ведь имя объекта это строка, а куча слайдеров в моём случае отличаются только именем. Кучу ифов нагородить? А задача-то всего лишь в слоте поставить в соответствие объекту целое число.
Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Bepec от Январь 17, 2013, 16:51 Нафига козе баян?
строка не помогает? Код: if (sender())->objectName().contains("slider")) Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: lighting от Январь 18, 2013, 16:29 Нафига козе баян? Она возможно и поможет, но вообще-то это не очень правильное решение - имя слайдера может и не содержать строки "slider".строка не помогает? Код: if (sender())->objectName().contains("slider")) Valter что мешает тебе сделать sender()->setValue(val); Ну или опиши подробнее что именно тебе нужно. Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Bepec от Январь 18, 2013, 16:48 to lighting: Я искренне верю, что все программисты придерживаются правила аля "типЭлементаИнтерфейса_егоНазначение".
Хотя встречал пару проектов, где была кнопка названа - editNameLine. Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Alex Custov от Январь 18, 2013, 16:57 Если маппить сам объект или получать его в теле слота (sender()), то получается что для того чтоб понять какой объект испустил сигнал нужен большой switch по количеству объектов. Хотя и switch не получится, ведь имя объекта это строка, а куча слайдеров в моём случае отличаются только именем. Кучу ифов нагородить? А задача-то всего лишь в слоте поставить в соответствие объекту целое число. Простота поставленной задачи не всегда превращается в простое решение. Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Bepec от Январь 18, 2013, 17:06 Перечитал тему - не понял в чём смысл повествования.
Вопрос решается одним проходом по массиву слайдеров и коннектом их к одному слоту. Если уж так вот западло по одному их подключать при создании. Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: LisandreL от Январь 18, 2013, 21:10 Сохраните свои значения в слайдерах (QObject::setProperty).
Потом в слоте читайте sender()->property( "myPropertyName" ).toInt(); Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Valter от Январь 22, 2013, 12:38 Ну или опиши подробнее что именно тебе нужно. Нужно узнать ползунок какого из N слайдеров двинул пользователь, при этом получить новое значение ползунка слайдера. При этом хотелось бы получить не указатель на слайдер, а идентификатор (от 0 до N-1). Т.е хотелось бы передать параметр int value сигнала valueChanged(int value) всех слайдеров в один единственный слот, в котором этот идентификатор будет использован как параметр в готовом виде. Напрашивается решение через QSignalMapper, позволяющий ввести идентификатор, но тогда как передать параметр сигнала? Если тупо насоединять сигналы valueChanged(int value) со слотом, то отправителя определять только по номеру содержащемуся в имени объекта (ну это же некрасиво). Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Bepec от Январь 22, 2013, 12:53 Почему некрасиво? У тебя идентификатор в любом случае будет в программе. В любом случае тебе надо будет его задавать. А беря его из имени ты как раз и реализуешь эту часть.
Не понимаю, что некрасивого... Сигналы идут на QString'гах, слоты идут на QString'ах, а вот фигачить идентификатор на QString'е плохо. Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: xokc от Январь 22, 2013, 13:57 По совету LisandreL, работать через property и sender(). Необходимо только понимать, что в момент обработки сигнала sender() может уже и не существовать.
Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Bepec от Январь 22, 2013, 14:24 Если sender() использовать правильно, как то - qobject_cast... тогда эта проверка убьёт все возможные неувязки.
Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: kambala от Январь 22, 2013, 14:31 можно хранить слайдеры в массиве/хеше и в обработчике слота получать индекс sender()'а (после qobject_cast) из контейнера
Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? Отправлено: Igors от Январь 22, 2013, 18:17 Соединить valueChanged со слотом того же слайдера, а оттуда уже посылать все что надо (value, ID и др)
|