Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Valter от Январь 17, 2013, 12:48



Название: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
Отправлено: 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"))
   //code


Название: Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
Отправлено: lighting от Январь 18, 2013, 16:29
Нафига козе баян?

строка не помогает?
Код:
if (sender())->objectName().contains("slider"))
   //code
Она возможно и поможет, но вообще-то это не очень правильное решение - имя слайдера может и не содержать строки "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 и др)