Обязательные аргументы сигналам/слотам

У меня в основном есть несколько сигналов событий, которые я хочу подключить к тому же слоту. То, что я хочу знать, - то, как может я передавать основанные на строке параметры тому же самому слоту так, чтобы слот знал, который является этим сигналом, прибывающим из. Одна альтернатива должна сделать столько же слотов, сколько существуют сигналы и затем соединяют их в 1:1 способ, но это эффективно, полагая, что код для всей обработки очень похож. Я пытался делать это, но я получаю некоторые ошибки:

connect(selecter1,SIGNAL(selected(QString)),this,SLOT(backgroundTypeChoiceMade(QString)));
connect(button1,SIGNAL(clicked()),this,SLOT(backgroundTypeChoiceMade("button1")));
connect(button2,SIGNAL(clicked()),this,SLOT(backgroundTypeChoiceMade("button2")));

Ошибка связана с параметрами, я являюсь передающим в последних 2 командах.. И backgroundTypeChoiceMade объявляется как это:

void backgroundTypeChoiceMade(QString);

Кто-то может сказать мне, что ошибка находится в вышеупомянутом коде?

10
задан Kiril Kirov 25 September 2015 в 10:36
поделиться

3 ответа

Вы можете использовать QSignalMapper . Хотя QSignalMapper - это ответ на ваш вопрос, я думаю, что ответ Джона Хансона - это тот путь, которым вы должны следовать. Так вы получите гораздо более чистый код.

9
ответ дан 3 December 2019 в 16:09
поделиться

Вы не можете передавать константы в connect () , потому что эффективные параметры выводятся во время выполнения, а не во время компиляции.

Однако, хотя это противоречит принципу OO , вы можете использовать QObject :: sender () , который дает указатель на эмиттер QObject .

Пример ниже:

void YourClass::YourClass() :
  m_button1(new QPushButton()),
  m_button2(new QPushButton())
{
  connect(m_button1, SIGNAL(clicked()), this, SLOT(yourSlot()));
  connect(m_button2, SIGNAL(clicked()), this, SLOT(yourSlot()));
}

void YourClass::yourSlot()
{
  if ((QPushButton* button = dynamic_cast<QPushButton*>(sender()))
  {
    // Now button points to a QPushButton* that you can compare with the pointers you already have

    if (button == m_button1)
    {
      // Whatever
    } else
    if (button == m_button2)
    {
      // Whatever
    }
  }
}

Если у вас много кнопок, вы также можете использовать QSignalMapper , указав идентификатор для каждой кнопки.

4
ответ дан 3 December 2019 в 16:09
поделиться

Что неэффективного в использовании отдельных слотов? Если есть общность в обработчиках слотов, то перенесите это в функцию, например, расширив пример ereOn:

void YourClass::YourClass() :
  m_button1(new QPushButton()),
  m_button2(new QPushButton())
{
  connect(m_button1, SIGNAL(clicked()), this, SLOT(yourSlot1()));
  connect(m_button2, SIGNAL(clicked()), this, SLOT(yourSlot2()));
}

void YourClass::common(int n)
{
}

void YourClass::yourSlot1()
{
    common (1);
}

void YourClass::yourSlot2()
{
    common (2);
}
5
ответ дан 3 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: