2011-10-28 7 views

Respuesta

15

Un método simple es tener una ranura intermedia que llame a la ranura que desee. p.ej.

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

y luego

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

tiene que definir de alguna manera de interpretar la cadena en un int.

+0

bien voy a intentar que – user896036

33

Desde el signals slots documentation:

La firma de una señal debe coincidir con la firma de la ranura de recepción. (De hecho, una ranura puede tener una firma más corta que la señal que recibe porque puede ignorar argumentos adicionales.)

Esto significa que una señal de la forma

signal(int, int, QString)

sólo puede ser conectados con las ranuras con las siguientes firmas

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

Como koan sugiere el mejor enfoque consiste en utilizar otra ranura con un argume QString nt y luego llama a la ranura que realmente quieres.

+0

¿Sería posible crear una clase para el objeto 'src', con las funciones necesarias en ellos? – chwi

2

Los valores predeterminados para los parámetros de ranura ayudan muy bien. Esto permite conectar señales con diferentes firmas para ranura (viceversa a @pnezis respuesta):

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

puede estar conectada a diferentes señales:

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

También Qt 4.8 sugieren útil clase QSignalMapper :

Esta clase recoge un conjunto de señales sin parámetros, y las reemite con enteros, cadenas o widg et parámetros correspondientes al objeto que envió la señal.

Pero sólo por un parámetro:

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 &))); 
Cuestiones relacionadas