У меня в основном есть несколько сигналов событий, которые я хочу подключить к тому же слоту. То, что я хочу знать, - то, как может я передавать основанные на строке параметры тому же самому слоту так, чтобы слот знал, который является этим сигналом, прибывающим из. Одна альтернатива должна сделать столько же слотов, сколько существуют сигналы и затем соединяют их в 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);
Кто-то может сказать мне, что ошибка находится в вышеупомянутом коде?
Вы можете использовать QSignalMapper . Хотя QSignalMapper - это ответ на ваш вопрос, я думаю, что ответ Джона Хансона - это тот путь, которым вы должны следовать. Так вы получите гораздо более чистый код.
Вы не можете передавать константы в 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 , указав идентификатор для каждой кнопки.
Что неэффективного в использовании отдельных слотов? Если есть общность в обработчиках слотов, то перенесите это в функцию, например, расширив пример 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);
}