как распознать какой сигнал излучается в слот? - PullRequest
0 голосов
/ 03 июня 2018

Я подключаю два сигнала к одному и тому же слоту.как это:

check = new QCheckBox();
connect(check, SIGNAL(clicked()), this, SLOT(MySlot()));
connect(check, SIGNAL(toggled(bool)),this,SLOT(MySlot()));

Я не хочу определять другой слот.В MySlot возможно ли распознать, какой сигнал обратного вызова слот?Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Новые слоты можно определять на лету, используя лямбды:)

class MyClass : public QWidget {
  QSomeLayout m_layout{this};
  QCheckBox m_check;
  enum Signal { Clicked, Toggled };

  Q_SLOT void mySlot(Signal);
public:
  MyClass( ... ) : ... {
    m_layout.addWidget(&m_check);
    connect(&m_check, &QCheckBox::clicked, this, [this]{ mySlot(Clicked); });
    connect(&m_check, &QCheckBox::toggled, this, [this]{ mySlot(Toggled); });
  }
};
0 голосов
/ 04 июня 2018

Вы также можете добавить свой собственный контекст к сигналу, если это поможет.Например, у меня был сервис, который загружал аватары пользователей для нескольких окон.Мне нужно было окно, чтобы загрузить только того пользователя, которого он интересовал, поэтому я передавал идентификатор пользователя в качестве контекста.Что-то вроде:

void UserService::downloadAvatar(const QString& url, const int context = 0) {
  ...// Make the http request, on finished:

  emit onAvatarDownloaded(context, responseBody);

}
0 голосов
/ 03 июня 2018

Вы можете использовать данные QMetaObject / QMetaMethod, связанные с отправителем, чтобы получить то, что вы хотите (не проверено) ...

void MyClass::MySlot ()
{
  auto index = senderSignalIndex();
  if (index == sender()->indexOfSignal("clicked()")) {

    /*
     * Got here as the result of a clicked() signal.
     */
  } else if (index == sender()->indexOfSignal("toggled(bool)")) {

    /*
     * Got here as the result of a toggled(bool) signal.
     */
  }
}

Однако, если выиспользую Qt5, я бы предложил использовать новый синтаксис сигнал / слот вместе с лямбдами ...

check = new QCheckBox();
connect(check, &QCheckBox::clicked,
        [this]()
        {
          MySlot(false);
        });
connect(check, &QCheckBox::toggled,
        [this](bool toggled)
        {
          MySlot(true, toggled);
        });

Наряду с изменением подписи MySlot ...

/**
 * @param from_toggled_signal If true this call was triggered by a
 *                            QCheckBox::toggled signal, otherwise it's
 *                            the result of a QCheckBox::clicked signal.
 *
 * @param toggle_value If from_toggled_signal is true then this was the
 *                     value passed to QCheckBox::toggled, otherwise unused.
 */
void MyClass::MySlot (bool from_toggled_signal, bool toggle_value = false)
{
  .
  .
  .
}
...