Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Pritcher от Январь 14, 2015, 21:37



Название: [Решено] Коннект сигнала с фактическим параметром
Отправлено: 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?


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Hrundel от Январь 14, 2015, 21:39
Как ты себе это представляешь - сигнал с сигналом соединить?

Смотри сюда (http://qt-project.org/doc/qt-4.8/signalsandslots.html)

Говнокодом скорее всего пахнет архитектура твоего приложения.


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Pritcher от Январь 14, 2015, 21:41
Сигнал с сигналом прекрасно коннектится

Архитектура, действительно, может быть неидеальной, но меня интересует именно возможность коннекта сигнала с фактическим параметром


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Hrundel от Январь 14, 2015, 21:43
Ну давай, вперед!


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Old от Январь 14, 2015, 21:49
Попробуйте новый формат коннекта + std::bind.


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: gil9red от Январь 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);
}

Код не проверял, но ошибок, вроде бы нет :)


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: kambala от Январь 14, 2015, 23:31
QSignalMapper


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Bepec от Январь 14, 2015, 23:49
А почему никто новый стандарт не приводит? :D


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Pritcher от Январь 15, 2015, 07:34
gil9red, думаю, вам метод будет самым подходящим в сложившейся ситуации, спасибо.
kambala, ваша идея тоже будет смотреться неплохо.

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

P.S. в конце концов, сделал QSignalMapper.
Соединять сигналы и слоты с фактическими параметрами, увы, Qt не умеет.


Название: Re: [Решено] Коннект сигнала с фактическим параметром
Отправлено: qate от Январь 15, 2015, 08:34
Имеется 4 кнопки в доке. Хочу сделать коннекты, связывающие сигнал triggered() и сигнал signalModeChanged( int n), где n от 1 до 4 соответственно.

QObject * QObject::sender() и затем signalModeChanged(i) - если я правильно понял желаемое


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Old от Январь 15, 2015, 10:43
Соединять сигналы и слоты с фактическими параметрами, увы, Qt не умеет.
Умеет.
И я даже написал как:
Код
C++ (Qt)
connect( actionDrawTrapeze, &QAction::triggered( ),  std::bind( &MyScene::signalModeChanged, m_scene, 4 ) );
 


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: __Heaven__ от Январь 15, 2015, 10:50
Как ты себе это представляешь - сигнал с сигналом соединить?

Смотри сюда (http://qt-project.org/doc/qt-4.8/signalsandslots.html)


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


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Hrundel от Январь 16, 2015, 23:52
Как ты себе это представляешь - сигнал с сигналом соединить?

Смотри сюда (http://qt-project.org/doc/qt-4.8/signalsandslots.html)


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

ОК, но вопрос - зачем?


Название: Re: [Решено] Коннект сигнала с фактическим параметром
Отправлено: kambala от Январь 17, 2015, 02:14
пересылать сигналы через цепочку объектов например


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: __Heaven__ от Январь 17, 2015, 12:17
ОК, но вопрос - зачем?
Ну вот, как у автора, например. Это дает возможность соединиться со слотом из другого класса, который испускает два сигнала. Я этим пользовался, когда мне хотелось коннекты перенести в конструктор родителя и мне это позволило сэкономить строчки в конструкторе потомка.


Название: Re: Коннект сигнала с фактическим параметром
Отправлено: Hrundel от Январь 17, 2015, 14:07
ОК, но вопрос - зачем?
Ну вот, как у автора, например. Это дает возможность соединиться со слотом из другого класса, который испускает два сигнала. Я этим пользовался, когда мне хотелось коннекты перенести в конструктор родителя и мне это позволило сэкономить строчки в конструкторе потомка.

Ок! Аргумент!