Buscar en el Blog

miércoles, 17 de febrero de 2016

Qt | Saber que objeto emitió una señal



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.