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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [Решено] Коннект сигнала с фактическим параметром  (Прочитано 7141 раз)
Pritcher
Гость
« : Январь 14, 2015, 21:37 »

Форумчане, привет!

Имеется 4 кнопки в доке. Хочу сделать коннекты, связывающие сигнал triggered() и сигнал signalModeChanged( int n), где n от 1 до 4 соответственно.
Вот что у меня есть
Код:
        connect( actionDrawDot, SIGNAL( triggered() ), m_scene, SIGNAL( signalModeChanged( 1 ) ) );
connect( actionDrawLine, SIGNAL( triggered( ) ), m_scene, SIGNAL( signalModeChanged( 2 ) ) );
connect( actionDrawSquare, SIGNAL( triggered( ) ), m_scene, SIGNAL( signalModeChanged( 3 ) ) );
connect( actionDrawTrapeze, SIGNAL( triggered( ) ), m_scene, SIGNAL( signalModeChanged( 4 ) ) );

Но это не работает, приходится для каждого сигнала делать отдельный слот, который выполняет лишь 1 действие: ставит нужное мне число, а это пахнет говнокодом.
Можно ли организовать нечто подобное без определения отдельного сигнала для QAction?
« Последнее редактирование: Январь 15, 2015, 07:54 от Pritcher » Записан
Hrundel
Гость
« Ответ #1 : Январь 14, 2015, 21:39 »

Как ты себе это представляешь - сигнал с сигналом соединить?

Смотри сюда

Говнокодом скорее всего пахнет архитектура твоего приложения.
« Последнее редактирование: Январь 14, 2015, 21:42 от Hrundel » Записан
Pritcher
Гость
« Ответ #2 : Январь 14, 2015, 21:41 »

Сигнал с сигналом прекрасно коннектится

Архитектура, действительно, может быть неидеальной, но меня интересует именно возможность коннекта сигнала с фактическим параметром
« Последнее редактирование: Январь 14, 2015, 21:43 от Pritcher » Записан
Hrundel
Гость
« Ответ #3 : Январь 14, 2015, 21:43 »

Ну давай, вперед!
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Январь 14, 2015, 21:49 »

Попробуйте новый формат коннекта + std::bind.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Январь 14, 2015, 22:20 »

Вы можете action объединить с помощью QActionGroup и ловить только 1 сигнал, сигнал от этой группы
По поводу, значений, которые действия назначают, у action есть метод setData, в него вы кладете номер который вам нужен
После в слоте, который соединен с сигналом группы получаете указатель на action, из него вытаскиваете номер, используя метод data

Код
C++ (Qt)
MainWindow::MainWindow() {
QAction * act1 = new QAction(this);
QAction * act2 = new QAction(this);
QAction * act3 = new QAction(this);
 
act1->setData(1);
act2->setData(2);
act3->setData(3);
 
QActionGroup * group = new QActionGroup(this);
group->addAction(act1); // Если сигналы из формы, то ui->act1
group->addAction(act2);
group->addAction(act3);
connect(group, SIGNAL(triggered(QAction*)), this, SLOT(my_slot(QAction*)));
}
 
void MainWindow::my_slot(QAction * a) {
   int num = a->data().toInt();
   emit m_scene->signalModeChanged(num);
}

Код не проверял, но ошибок, вроде бы нет Улыбающийся
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4730



Просмотр профиля WWW
« Ответ #6 : Январь 14, 2015, 23:31 »

QSignalMapper
Записан

Изучением 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
Bepec
Гость
« Ответ #7 : Январь 14, 2015, 23:49 »

А почему никто новый стандарт не приводит? Веселый
Записан
Pritcher
Гость
« Ответ #8 : Январь 15, 2015, 07:34 »

gil9red, думаю, вам метод будет самым подходящим в сложившейся ситуации, спасибо.
kambala, ваша идея тоже будет смотреться неплохо.

Bepec, спасибо за инфу.

P.S. в конце концов, сделал QSignalMapper.
Соединять сигналы и слоты с фактическими параметрами, увы, Qt не умеет.
« Последнее редактирование: Январь 15, 2015, 07:54 от Pritcher » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #9 : Январь 15, 2015, 08:34 »

Имеется 4 кнопки в доке. Хочу сделать коннекты, связывающие сигнал triggered() и сигнал signalModeChanged( int n), где n от 1 до 4 соответственно.

QObject * QObject::sender() и затем signalModeChanged(i) - если я правильно понял желаемое
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #10 : Январь 15, 2015, 10:43 »

Соединять сигналы и слоты с фактическими параметрами, увы, Qt не умеет.
Умеет.
И я даже написал как:
Код
C++ (Qt)
connect( actionDrawTrapeze, &QAction::triggered( ),  std::bind( &MyScene::signalModeChanged, m_scene, 4 ) );
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Как ты себе это представляешь - сигнал с сигналом соединить?

Смотри сюда


В этой же статье имеется
Цитировать
It is even possible to connect a signal directly to another signal.
Записан
Hrundel
Гость
« Ответ #12 : Январь 16, 2015, 23:52 »

Как ты себе это представляешь - сигнал с сигналом соединить?

Смотри сюда


В этой же статье имеется
Цитировать
It is even possible to connect a signal directly to another signal.

ОК, но вопрос - зачем?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4730



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

пересылать сигналы через цепочку объектов например
Записан

Изучением 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
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

ОК, но вопрос - зачем?
Ну вот, как у автора, например. Это дает возможность соединиться со слотом из другого класса, который испускает два сигнала. Я этим пользовался, когда мне хотелось коннекты перенести в конструктор родителя и мне это позволило сэкономить строчки в конструкторе потомка.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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