Как мы можем подключать сигналы и слот с разными аргументами?

В Qt для сигналов и слотов требуются соответствующие типы аргументов:

QObject:: connect: Несовместимые аргументы отправителя/получателя QLabel:: linkActivated (QString) → Button:: call (int)

Как я могу реализовать такую ​​комбинацию?

Ответы

Ответ 1

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

connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString)));

а затем

void receiveLink(QString blah)
{
  int response = someFunction(blah);
  mybutton->call(response);
}

Вы должны определить способ интерпретации строки в int.

Ответ 2

Из документации сигналов слотов:

Подпись сигнала должна соответствовать сигнатуре получателя слот. (Фактически, слот может иметь более короткую подпись, чем сигнал потому что он может игнорировать дополнительные аргументы.)

Это означает, что сигнал формы

signal(int, int, QString)

может быть подключен только слотами со следующими сигнатурами

slot1(int, int, QString)
slot2(int, int)
slot3(int)
slot4()

Как показывает koan, наилучшим подходом является использование другого слота с аргументом QString, а затем вызов необходимого вам слота.

Ответ 3

Значения по умолчанию для параметров слота очень хорошо помогают. Это позволяет подключать сигналы с различными сигнатурами к слоту (наоборот, к ответу @pnezis):

private slots:
  void slot( int x = 10, int y = 20, QString text = QString() );

может быть подключен к различным сигналам:

signal1(int, int, QString)
signal2(int, int)
signal3(int)
signal4()

Также Qt 4.8 предлагает полезный QSignalMapper класс:

Этот класс собирает набор безпараметрических сигналов и повторно испускает их с целыми, строковыми или виджетными параметрами, соответствующими объекту, который отправил сигнал.

Но только для одного параметра:

QSignalMapper* mapper = new QSignalMapper(this) ;

connect(action, SIGNAL(triggered()), mapper, SLOT(map())) ;
mapper->setMapping(action, "param value") ;

connect(mapper, SIGNAL(mapped(const QString &)),
  this, SIGNAL(clicked(const QString &)));