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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача параметров в слот  (Прочитано 14752 раз)
Crazy Sage
Гость
« : Март 20, 2009, 11:45 »

Можно ли сделать так:
Два QAction'а, на их сигналы activated() зацеплен один и тот же слот,которому передается некий интовый флаг и он в зависимости от флага обрабатывает каждый сигнал по своему (просто есть достаточно большое количество одинакового для всех сигналов кода)?
Или придется делать отдельные слоты?
Записан
yesrus
Гость
« Ответ #1 : Март 20, 2009, 11:48 »

Передавайте Ваще значение как и любой другой функции...никаких пробелм с этим нет.
Записан
igor_bogomolov
Гость
« Ответ #2 : Март 20, 2009, 11:58 »

Множество сигналов можно связать с одним слототом. Параметры можно и не передавать. Узнать кто прислал сигнал можно через:
Цитировать
QObject * QObject::sender () const   [protected]
Записан
Crazy Sage
Гость
« Ответ #3 : Март 20, 2009, 12:00 »

Я создал слот
void DlgMain::threadSlot(int flag)
и пытаюсь сделать
connect(sinAction, SIGNAL(activated()), this, SLOT(threadSlot(1)));
connect(cosAction, SIGNAL(activated()), this, SLOT(threadSlot(2)));

компилится нормально, но при выполнении в дебаг падает

QObject::connect: No such slot DlgMain::threadSlot(1)
QObject::connect: No such slot DlgMain::threadSlot(2)
Записан
igor_bogomolov
Гость
« Ответ #4 : Март 20, 2009, 12:10 »

Несовместимые параметры в сигнале и слоте.

Замените на
connect(sinAction, SIGNAL(activated()), this, SLOT(threadSlot()));
connect(cosAction, SIGNAL(activated()), this, SLOT(threadSlot()));

И читайте пост выше. Надеюсь подойдет для тройки.
Записан
Crazy Sage
Гость
« Ответ #5 : Март 23, 2009, 09:46 »

Спасибо, QObject::sender() это то, что надо.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #6 : Декабрь 17, 2010, 17:26 »

Спасибо большое! Как раз то что я искал.

У sender и receiver должно быть одинаковое количество параметров, или в sender может быть больше, но они будут игнорироваться receiver-ом. У activated() нет ни каких параметров!
Записан

Qt 5.11.0, Win, MinGW
voral
Гость
« Ответ #7 : Декабрь 17, 2010, 18:38 »

У sender и receiver должно быть одинаковое количество параметров, или в sender может быть больше, но они будут игнорироваться receiver-ом. У activated() нет ни каких параметров!
Что то вы зпутались в понятиях Улыбающийся
sender и receiver - это объекты.
А параметры передаются/принимаются сигналом и слотом. Если сигнал не передает ни одного параметра, то и принимать не чего. Однако если слот будет иметь параметр со значением по умолчанию, то его можно вешать на сигнал ни чего не передающий.

Если вам достаточно просто определить что за объект передал сигнал то можно сделать примерно так  в слоте
Код:
  MyObjectClass *myObject = dynamic_cast<MyObjectClass *>(sender());
  if (myObject) - если экземпляр этого класса
  else
{
  MyObjectClassA *myObjectA = dynamic_cast<MyObjectClassA *>(sender());
  if (myObjectA) - если экземпляр этого класса
}


Если же ваш общий код использует некие похожие методы. То нужно эти метод вынести в общий класс пердок.
« Последнее редактирование: Декабрь 17, 2010, 18:48 от voral » Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #8 : Декабрь 17, 2010, 20:30 »

Цитировать
Что то вы зпутались в понятиях
Я не запутался. Я все сделал как было выше указано. Я не правильно изъяснился. Что то в голову вбилось sender и reciever.
С помощью QObject::sender() я получал объект который отправлял этот сигнал, каждому объекту соответствовал ключ. В соответствии с этим ключом в дочернем окне выполнялся определенный код.
Код:
void MainWin::slot()
{
     Widget *widget = new Widget(pws, 0, Qt::Flag);
     if(QObject::sender() == Бла-бла-бла)
          widget->chooseAction(id = 1);
     else
          widget->chooseAction(id = 2);
     widget->show();
}

void Widget::chooseAction(id)
{
     switch(id)
     {
      case 1:
      case 2:
      ...
     }
}

Что то вроде этого. Это я так просто набросал. У чуть чуть по другому. Я у Action вытаскиваю text() и потом провожу аналогию. и т.д.
Записан

Qt 5.11.0, Win, MinGW
fuCtor
Гость
« Ответ #9 : Декабрь 25, 2010, 06:52 »

Я создал слот
void DlgMain::threadSlot(int flag)
и пытаюсь сделать
connect(sinAction, SIGNAL(activated()), this, SLOT(threadSlot(1)));
connect(cosAction, SIGNAL(activated()), this, SLOT(threadSlot(2)));

компилится нормально, но при выполнении в дебаг падает

QObject::connect: No such slot DlgMain::threadSlot(1)
QObject::connect: No such slot DlgMain::threadSlot(2)


На этапе связывание сигнал-слотов НЕЛЬЗЯ указывать параметры которые будут переданы (можно даже исходники посмотреть как это в приниципе работает и будет понятно все).

Если нужно как-то разделить (проиндексировать привязанные сигналы, то их можно промапировать, читаем в документации про QSignalMapper
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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