Russian Qt Forum
Ноябрь 24, 2024, 08:51
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами? (Прочитано 8911 раз)
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
Сообщений: 4747
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #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
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #2 :
Январь 17, 2013, 13:28 »
Цитата: kambala от Январь 17, 2013, 13:06
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotWithParam(int))) или я чего-то не понял
Дык это для одного слайдера. А если их куча? и делают одно и то же с разницей в одном параметре. Вот и хотелось бы с помощью QSignalMapper передать 1. идентификатор слайдера; 2. новое значение ползунка.
Вопрос даже шире. Вообще, можно ли с помощью QSignalMapper передавать собственные параметры сигналов?
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #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
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #4 :
Январь 17, 2013, 14:22 »
Цитата: Valter от Январь 17, 2013, 13:28
Дык это для одного слайдера. А если их куча? и делают одно и то же с разницей в одном параметре.
Используй sender() в теле слота вместо signalMapper чтобы узнать кто именно сигнал испустил.
«
Последнее редактирование: Январь 17, 2013, 14:24 от lighting
»
Записан
Valter
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #5 :
Январь 17, 2013, 15:45 »
Если маппить сам объект или получать его в теле слота (sender()), то получается что для того чтоб понять какой объект испустил сигнал нужен большой switch по количеству объектов. Хотя и switch не получится, ведь имя объекта это строка, а куча слайдеров в моём случае отличаются только именем. Кучу ифов нагородить? А задача-то всего лишь в слоте поставить в соответствие объекту целое число.
Записан
Bepec
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #6 :
Январь 17, 2013, 16:51 »
Нафига козе баян?
строка не помогает?
Код:
if (sender())->objectName().contains("slider"))
//code
Записан
lighting
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #7 :
Январь 18, 2013, 16:29 »
Цитата: Bepec от Январь 17, 2013, 16:51
Нафига козе баян?
строка не помогает?
Код:
if (sender())->objectName().contains("slider"))
//code
Она возможно и поможет, но вообще-то это не очень правильное решение - имя слайдера может и не содержать строки "slider".
Valter
что мешает тебе сделать sender()->setValue(val);
Ну или опиши подробнее что именно тебе нужно.
Записан
Bepec
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #8 :
Январь 18, 2013, 16:48 »
to lighting: Я искренне верю, что все программисты придерживаются правила аля "типЭлементаИнтерфейса_егоНазначение".
Хотя встречал пару проектов, где была кнопка названа - editNameLine.
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #9 :
Январь 18, 2013, 16:57 »
Цитата: Valter от Январь 17, 2013, 15:45
Если маппить сам объект или получать его в теле слота (sender()), то получается что для того чтоб понять какой объект испустил сигнал нужен большой switch по количеству объектов. Хотя и switch не получится, ведь имя объекта это строка, а куча слайдеров в моём случае отличаются только именем. Кучу ифов нагородить? А задача-то всего лишь в слоте поставить в соответствие объекту целое число.
Простота поставленной задачи не всегда превращается в простое решение.
Записан
Bepec
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #10 :
Январь 18, 2013, 17:06 »
Перечитал тему - не понял в чём смысл повествования.
Вопрос решается одним проходом по массиву слайдеров и коннектом их к одному слоту.
Если уж так вот западло по одному их подключать при создании.
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #11 :
Январь 18, 2013, 21:10 »
Сохраните свои значения в слайдерах (QObject::setProperty).
Потом в слоте читайте sender()->property( "myPropertyName" ).toInt();
Записан
Valter
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #12 :
Январь 22, 2013, 12:38 »
Цитата: lighting от Январь 18, 2013, 16:29
Ну или опиши подробнее что именно тебе нужно.
Нужно узнать ползунок какого из N слайдеров двинул пользователь, при этом получить новое значение ползунка слайдера. При этом хотелось бы получить не указатель на слайдер, а идентификатор (от 0 до N-1). Т.е хотелось бы передать параметр int value сигнала valueChanged(int value) всех слайдеров в один единственный слот, в котором этот идентификатор будет использован как параметр в готовом виде.
Напрашивается решение через QSignalMapper, позволяющий ввести идентификатор, но тогда как передать параметр сигнала?
Если тупо насоединять сигналы valueChanged(int value) со слотом, то отправителя определять только по номеру содержащемуся в имени объекта (ну это же некрасиво).
Записан
Bepec
Гость
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #13 :
Январь 22, 2013, 12:53 »
Почему некрасиво? У тебя идентификатор в любом случае будет в программе. В любом случае тебе надо будет его задавать. А беря его из имени ты как раз и реализуешь эту часть.
Не понимаю, что некрасивого... Сигналы идут на QString'гах, слоты идут на QString'ах, а вот фигачить идентификатор на QString'е плохо.
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Как вызывать один слот от срабатывания неск. одинаковых сигналов с параметрами?
«
Ответ #14 :
Январь 22, 2013, 13:57 »
По совету LisandreL, работать через property и sender(). Необходимо только понимать, что в момент обработки сигнала sender() может уже и не существовать.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...