Як мы можам злучыць сігналы і слот з рознымі аргументамі?

У Qt, сігналы і слоты патрабуюць адпаведнасці тыпаў аргументаў:

QObject::connect: Incompatible sender/receiver arguments QLabel::linkActivated(QString) --> Button::call(int)

Як я магу рэалізаваць камбінацыю, як гэта?

15

3 адказы

З сігналізавалых слотаў дакументацыі :

<Р> сігнатур сігналу павінен супадаць з подпісам які прымае   слот. (Фактычна, слот можа мець больш кароткую сігнатуру, чым сігнал, які ён   атрымлівае, таму што ён можа ігнараваць лішнія аргументы.)

Гэта азначае, што сігнал выгляду

signal(int, int, QString)

можа быць злучаны толькі з пазамі з наступнымі подпісамі

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

Як коано прапануе найлепшы падыход заключаецца ў выкарыстанні іншага слота з QString аргументам, а затым выклікаць слот, які вы на самой справе хочаце.

33
дададзена
было б магчыма стварыць клас для ЦСІ аб'екта, з неабходнымі функцыямі ў іх?
дададзена аўтар chwi, крыніца

Просты спосаб мець прамежкавы слот, які выклікае слот, які вы хочаце. напрыклад

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

потым

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

Вы павінны вызначыць, нейкім чынам інтэрпрэтаваць радок у міжнар.

17
дададзена
Добра, я паспрабую, што
дададзена аўтар user896036, крыніца

Значэнні па змаўчанні для параметраў шчылінных дапамагае вельмі добра. Гэта дазваляе падключаць сігналы з рознымі сігнатурамі слота (наадварот для @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 &)));
3
дададзена