2010-11-11 11 views
14

Parece que no puedo pasar un argumento a una ranura. Si no paso una discusión, la función funciona bien. Si paso un argumento (entero), obtengo los errores "No such name type" y "No such slot" cuando compilo.Qt cuestión de pasar argumentos a la ranura

En mi cabecera, declaro:

private slots: 
void addButton(int); 
signals: 
void clicked(int) 

en mi Main.cpp, que hago:

int count; 
int count = 0; 
QPushButton* button = new QPushButton("Button"); 
_layout->addWidget(button); 
connect(button, SIGNAL(clicked(count), this, SLOT(addButton(count))); 

....

void Main::addButton(int count) { 

//do stuff with count 

} 

Respuesta

17

Sebastian tiene razón en que no puede hacer esto en la forma en que lo está intentando, sin embargo, Qt brinda una clase que le brinda la funcionalidad que desea.

Echa un vistazo a QSignalMapper. Le permite asociar un número entero con un par de objeto/señal. Luego se conecta a sus señales en lugar de directamente al botón.

+1

ah, parece que va a funcionar. ¡Gracias! –

8

La señal y la ranura debe tener el mismo número y tipo (s) de argumento (s), y solo puede pasar los argumentos de la señal a la ranura, no a cualquier variable o valor que desee.

+0

Edité el código anterior para reflejar lo que probé (basado en un ejemplo que encontré), pero todavía no funciona. –

+0

La señal clicked() está definida por la clase de botón, no puede cambiar eso (a menos que escriba su propia clase de botón y lo haga, pero dudo que esta sea la solución para lo que esté tratando de hacer aquí). –

3

Puedo ver tres problemas con esto.

En primer lugar, la señal es emitida por clicked()QPushButton (sin parámetros), pero que está tratando de redefinir en su propia clase (con un parámetro int). Si quieres hacer esto:

SignalClass* objectWithSignals = new SignalClass; 
SlotClass* objectWithSlots = new SlotClass; 
connect(objectWithSignals, SIGNAL(a()), objectWithSlots, SLOT(b())); 

entonces sólo puede conectarse a las señales ya definidos en SignalClass. En otras palabras, la señal a() debe pertenecer a SignalClass, no a SlotClass.

(De hecho, clicked() se define en la clase base QPushButton 's QAbstractButton.)

En segundo lugar, dentro de la función connect(), es necesario especificar las firmas de señal y de ranura con su parámetro tipos. Donde tiene count dentro de la función connect(), debe ser int.

Y en tercer lugar, falta un soporte en su llamada para conectarse: SIGNAL(clicked(count)).

Espero que ayude.

+0

Me sorprende que la suya sea la única respuesta que menciona el error del argumento donde el nombre de una variable se pasa a SIGNAL y SLOT en la llamada de conexión; el código de muestra nunca se compilará a menos que "count" sea un tipo. – pixelgrease

Cuestiones relacionadas