Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] signals de varios pushButton en QTCreator

Estas en el tema de signals de varios pushButton en QTCreator en el foro de C/C++ en Foros del Web. Hola, que tal? Tengo poca experiencia con el tema de QT, y estoy desarrollando un juego que consta de 10 niveles. La interfaz grafica tiene ...
  #1 (permalink)  
Antiguo 13/02/2015, 15:50
 
Fecha de Ingreso: febrero-2015
Mensajes: 4
Antigüedad: 9 años, 9 meses
Puntos: 0
Pregunta signals de varios pushButton en QTCreator

Hola, que tal?
Tengo poca experiencia con el tema de QT, y estoy desarrollando un juego que consta de 10 niveles.
La interfaz grafica tiene 10 botones que todos tienen que abrir una misma ventana.
El problema reside en que yo necesito saber que boton se ha apretado, con el fin de cargar el nivel respectivo.
Mi pregunta es como puedo hacer eso?
Muchas gracias
  #2 (permalink)  
Antiguo 13/02/2015, 15:53
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: signals de varios pushButton en QTCreator

Bueno, puedes asociar un callback diferente a cada botón. O puedes asociar datos al botón o callback para poder identificar el botón.
  #3 (permalink)  
Antiguo 13/02/2015, 16:14
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 15 años, 2 meses
Puntos: 12
Respuesta: signals de varios pushButton en QTCreator

Hola

Puedes usar un QSignalMapper:
http://doc.qt.io/qt-5/qsignalmapper.html

Algo así:
Código C++:
Ver original
  1. signalMapper = new QSignalMapper(this);
  2.  
  3.     // conectar los botones al mapa
  4.     connect(ui->pushButton_1, SIGNAL(clicked()), signalMapper, SLOT(map()));
  5.     signalMapper->setMapping(ui->pushButton_1, 1);
  6.  
  7.     connect(ui->pushButton_2, SIGNAL(clicked()), signalMapper, SLOT(map()));
  8.     signalMapper->setMapping(ui->pushButton_2, 2);
  9.  
  10.     connect(ui->pushButton_3, SIGNAL(clicked()), signalMapper, SLOT(map()));
  11.     signalMapper->setMapping(ui->pushButton_3, 3);
  12.  
  13.     connect(ui->pushButton_4, SIGNAL(clicked()), signalMapper, SLOT(map()));
  14.     signalMapper->setMapping(ui->pushButton_4, 4);
  15.  
  16.     connect(ui->pushButton_5, SIGNAL(clicked()), signalMapper, SLOT(map()));
  17.     signalMapper->setMapping(ui->pushButton_5, 5);
  18.  
  19.     connect(ui->pushButton_6, SIGNAL(clicked()), signalMapper, SLOT(map()));
  20.     signalMapper->setMapping(ui->pushButton_6, 6);
  21.  
  22.     // conectar el mapa con el SLOT
  23.     connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(botonPulsado(int)));

Luego en el SLOT recibes el código que asignaste a cada botón, por lo que sabes cual se pulsó.

Saludos
  #4 (permalink)  
Antiguo 14/02/2015, 06:30
 
Fecha de Ingreso: febrero-2015
Ubicación: France
Mensajes: 12
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: signals de varios pushButton en QTCreator

Hola,

QSignalMapper es una buena idea.

Y si tu tienes otros tipos de SIGNALs que no son compatibles con QSignalMapper (Por ejemplo colorSelected()), entonces hay QObject::sender() que funciona con todo.

Por ejemplo para recuperar el boton que se ha apretado en el slot, es algo así :

Código C++:
Ver original
  1. QPushButton *elBoton = qobject_cast<QPushButton *>(sender());

Saludos.
  #5 (permalink)  
Antiguo 14/02/2015, 17:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: signals de varios pushButton en QTCreator

Cita:
Iniciado por Papu93 Ver Mensaje
Hola, que tal?
Tengo poca experiencia con el tema de QT, y estoy desarrollando un juego que consta de 10 niveles.
La interfaz grafica tiene 10 botones que todos tienen que abrir una misma ventana.
El problema reside en que yo necesito saber que boton se ha apretado, con el fin de cargar el nivel respectivo.
Mi pregunta es como puedo hacer eso?
Muchas gracias
Si todos los botones van a parar al mismo slot, puedes usar el método "sender( )", presente en todos los objetos que heredan de QObject. Este método te devuelve un puntero al QObject que ha emitido la última señal:

Código C++:
Ver original
  1. void ventana::ButtonClicked( )
  2. {
  3.   // Opción 1: Si tienes acceso al puntero del botón
  4.   if ( sender( ) == btn1 )
  5.  
  6.   // Opción 2: Puedes verificar el nombre del objeto y, de paso, el tipo.
  7.   // o cualquier otra característica del mismo que te permita identificarlo.
  8.   QButton* button = dynamic_cast< QButton* >( sender( ) );
  9.   if ( button && button->name( ) == "NombreBoton1" )
  10. }

También puedes hacer uso de "SignalMapper", como te ha comentado jc_moc.

Un saludo.
  #6 (permalink)  
Antiguo 18/02/2015, 11:18
 
Fecha de Ingreso: febrero-2015
Mensajes: 4
Antigüedad: 9 años, 9 meses
Puntos: 0
De acuerdo Respuesta: signals de varios pushButton en QTCreator

Muchas gracias por tomarse un tiempo y contestar, use QSignalMapper como me explico jc_moj y anda perfecto!

Etiquetas: c++, slot, ventana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:14.