A veces es necesario saber que objeto emitió la señal. Por ejemplo, si tengo agregados dinamicamente "n" objetos en mi caso 10 botones y quiero saber en que boton se hizo click, entonces se usaria la función sender de QObject.
int n=0;
for(int i=0;i<10;i++)
{
QPushButton *mesa=new QPushButton(this);
mesa->setText(QString::number(i));//asignando un texto al botón
mesa->move(n,100);//para posicionar los botobes
n=n+100;
//conectamos el boton con el slot
connect(mesa,SIGNAL(clicked()),this,SLOT(abrirComanda()));
}
En el código anterior, estoy agregando 10 botones a mi ventana. Además estoy conectando todos los botones al SLOT abrirComanda. Si desea saber en que boton se hizo click, colocaria el siguiente código en el SLOT.
QObject *senderObj = sender();
Con sender obtengo un puntero al objeto que envió la señal, si se llama en una ranura activado por una señal; de lo contrario, devuelve 0. El puntero es válido sólo durante la ejecución de la ranura que se llama a esta función a partir del contexto del hilo de este objeto.
El puntero devuelto por esta función se convierte en no válida si el remitente es destruido, o si la ranura está desconectado de la señal del emisor.
void frmVentanaMesas::abrirComanda()
{
QMessageBox m;
QObject *senderObj = sender();
m.setText(qobject_cast<QPushButton *>(senderObj)->text());
m.exec();
}
En el codigo anterior, despues de obtener un puntero al objeto desde donde se emitió la señal, realizo un cast para convertirlo a la clase correspondiente, para poder accerder a todos los métodos, funciones y/o propiedades.Advertencia: Esta función viola el principio orientado a objetos de la modularidad. Sin embargo, obtener el acceso al remitente podría ser útil cuando muchas señales están conectados a una única ranura.
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.