elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Taller] Signals y Slots en Qt.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Taller] Signals y Slots en Qt.  (Leído 9,854 veces)
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
[Taller] Signals y Slots en Qt.
« en: 15 Julio 2010, 03:12 am »

Los Signals y Slots son los mecanismos de comunicación utilizados para comunicar objetos que heredan de Q_OBJECT. Q_OBJECT es la base de todos los objetos de Qt.

Los Slot son simplemente funciones, que se quiere decir con esto, que pueden ser llamadas por el objeto según el estandar de C++ precediendo el nombre del metodo del nombre de la funcion seguida de un punto(.) o precediendola de una  flecha(->).

Las señales podrian interpretarse como los valores de retorno que se enviaran al metodo que esta conectado a esta señal. Se declaran como si fueran metodos pero sin procedimientos. Se envian colocando primero la macro “emit” posteriormente la señal rellenando sus argumentos con los valores que se desean emitir.

Los Signals y Slots se conectan utilizando la API de Qt llamada connect(), la cual lleva la siguiente forma: connect(const Qobject* sender, const char* signal, const Qobject* reciever, const char*  slot);

Hay ciertas caracteristicas con las que cuenta la comunicación entre los signals y los slots, entre estas estan:

  • Son type-safe, esto quiere decir que la signal debe encajar con el slot.
  • Los objetos emiten señales, pero no se preocupan de que estos sean recibidos por un slot.
  • Se pueden conectar multiples signals a un solo slot.
  • Se pueden conectar un signal a multiples slots.
  • Se puede conectar un signal con otro signal.
  • Para conectarse un signal con un slot estos deben tener el mismo numero de parametros y el mismo tipo de parametros en el orden correcto.
  • Existe una simple excepcion, si un signal contiene mas parametros que un slot y ambos se conectan, se obviaran los parametros sobrantes en el signal.

No existe mejor forma para hechar un vistazo que viendo un codigo de ejemplo que demuestre lo antes explicado.

Código
  1. //Ejemplo.h
  2. #ifndef EJEMPLO_H
  3. #define EJEMPLO_H
  4.  
  5. #include <QtGui>
  6.  
  7. class QSpinBox;
  8. class QSlider;
  9. class QLabel;
  10. class QVBoxLayout;
  11. class QHBoxLayout;
  12.  
  13. class Ejemplo : public QWidget
  14. {
  15.    Q_OBJECT
  16.  
  17. signals:
  18.    void setRGB(int,int,int);
  19.  
  20. private slots:
  21.    void getRGB(int,int,int);
  22.    void setRed(int);
  23.    void setGreen(int);
  24.    void setBlue(int);
  25.    void setAlpha(int);
  26.  
  27. private:
  28.    short int red, green, blue, alpha;
  29.    QSpinBox *SpinRed, *SpinGreen, *SpinBlue;
  30.    QSlider *SliderRed, *SliderGreen, *SliderBlue;
  31.    QLabel *LabelRed, *LabelBlue, *LabelGreen;
  32.    QVBoxLayout *LeftVertical, *MiddleRightVertical, *MiddleLeftVertical;
  33.    QHBoxLayout *MainHorizontal;
  34.  
  35.  
  36. public:
  37.    Ejemplo(QWidget *parent = 0);
  38.  
  39.  
  40. };
  41.  
  42. #endif // EJEMPLO_H
  43.  


Código
  1. //Ejemplo.cpp
  2. #include "ejemplo.h"
  3.  
  4. Ejemplo::Ejemplo(QWidget *parent)
  5.    : QWidget(parent)
  6. {
  7.  
  8.    //Construimos los Slider que utilizaremos.
  9.    this->SliderBlue = new QSlider(Qt::Vertical,0);
  10.    this->SliderBlue->setMinimum(0);
  11.    this->SliderBlue->setMaximum(255);
  12.    this->SliderRed = new QSlider(Qt::Vertical,0);
  13.    this->SliderRed->setMinimum(0);
  14.    this->SliderRed->setMaximum(255);
  15.    this->SliderGreen = new QSlider(Qt::Vertical,0);
  16.    this->SliderGreen->setMinimum(0);
  17.    this->SliderGreen->setMaximum(255);
  18.  
  19.    //Construimos los SpinBox que utilizaremos.
  20.  
  21.    this->SpinRed = new QSpinBox;
  22.    this->SpinRed->setMinimum(0);
  23.    this->SpinRed->setMaximum(255);
  24.    this->SpinBlue = new QSpinBox;
  25.    this->SpinBlue->setMinimum(0);
  26.    this->SpinBlue->setMaximum(255);
  27.    this->SpinGreen = new QSpinBox;
  28.    this->SpinGreen->setMinimum(0);
  29.    this->SpinGreen->setMaximum(255);
  30.  
  31.    //Construimos los Labels.
  32.    this->LabelBlue = new QLabel("Azul");
  33.    this->LabelGreen = new QLabel("Verde");
  34.    this->LabelRed = new QLabel("Rojo");
  35.  
  36.    //Construimos los Layout para Organizar.
  37.    this->LeftVertical = new QVBoxLayout;
  38.    this->MiddleLeftVertical = new QVBoxLayout;
  39.    this->MiddleRightVertical = new QVBoxLayout;
  40.    this->MainHorizontal = new QHBoxLayout;
  41.  
  42.    //Vamos agregando los Objetos a los Layout.
  43.    this->LeftVertical->addWidget(this->LabelRed);
  44.    this->LeftVertical->addWidget(this->SpinRed);
  45.    this->LeftVertical->addWidget(this->SliderRed);
  46.    this->MiddleLeftVertical->addWidget(this->LabelGreen);
  47.    this->MiddleLeftVertical->addWidget(this->SpinGreen);
  48.    this->MiddleLeftVertical->addWidget(this->SliderGreen);
  49.    this->MiddleRightVertical->addWidget(this->LabelBlue);
  50.    this->MiddleRightVertical->addWidget(this->SpinBlue);
  51.    this->MiddleRightVertical->addWidget(this->SliderBlue);
  52.    this->MainHorizontal->addLayout(this->LeftVertical);
  53.    this->MainHorizontal->addLayout(this->MiddleLeftVertical);
  54.    this->MainHorizontal->addLayout(this->MiddleRightVertical);
  55.    this->setLayout(this->MainHorizontal);
  56.    this->setWindowTitle("Cambia el Fondo(Codigo de Ejemplo)");
  57.  
  58.    this->MainHorizontal->addStretch();
  59.    this->setFixedHeight(this->sizeHint().height());
  60.  
  61.    this->red = 0;
  62.    this->blue = 0;
  63.    this->green = 0;
  64.    this->alpha = 0;
  65.  
  66.    //Realizamos las conexiones que necesitaremos.
  67.    connect(this->SpinRed,SIGNAL(valueChanged(int)),this->SliderRed,SLOT(setValue(int)));
  68.    connect(this->SpinGreen,SIGNAL(valueChanged(int)),this->SliderGreen,SLOT(setValue(int)));
  69.    connect(this->SpinBlue,SIGNAL(valueChanged(int)),this->SliderBlue,SLOT(setValue(int)));
  70.    connect(this->SliderRed,SIGNAL(valueChanged(int)),this->SpinRed,SLOT(setValue(int)));
  71.    connect(this->SliderGreen,SIGNAL(valueChanged(int)),this->SpinGreen,SLOT(setValue(int)));
  72.    connect(this->SliderBlue,SIGNAL(valueChanged(int)),this->SpinBlue,SLOT(setValue(int)));
  73.    connect(this->SliderRed,SIGNAL(valueChanged(int)),this,SLOT(setRed(int)));
  74.    connect(this->SliderGreen,SIGNAL(valueChanged(int)),this,SLOT(setGreen(int)));
  75.    connect(this->SliderBlue,SIGNAL(valueChanged(int)),this,SLOT(setBlue(int)));
  76.    connect(this,SIGNAL(setRGB(int,int,int)),this,SLOT(getRGB(int,int,int)));
  77.  
  78.  
  79.  
  80.    emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color.
  81.  
  82.    }
  83.  
  84. void Ejemplo::setAlpha(int change)
  85. {
  86.    this->alpha = change;
  87.    emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color.
  88.  
  89.    }
  90.  
  91. void Ejemplo::setRed(int change)
  92. {
  93.    this->red = change;
  94.    emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color.
  95.  
  96.    }
  97.  
  98. void Ejemplo::setGreen(int change)
  99. {
  100.    this->green = change;
  101.    emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color.
  102.  
  103.    }
  104.  
  105. void Ejemplo::setBlue(int change)
  106.  
  107. {
  108.    this->blue = change;
  109.    emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color.
  110.    }
  111.  
  112. void Ejemplo::getRGB(int red, int green, int blue)
  113. {
  114. QColor *Background = new QColor(red,green,blue,255);
  115. QPalette *Paleta = new QPalette;
  116. Paleta->setColor(QPalette::Background,Background->convertTo(QColor::Rgb));
  117. this->setPalette(*Paleta);
  118. }
  119.  
  120.  

Código
  1. //main.cpp
  2. #include <QtGui/QApplication>
  3. #include "ejemplo.h"
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.    QApplication a(argc, argv);
  8.    Ejemplo w;
  9.    w.show();
  10.    return a.exec();
  11. }
  12.  


« Última modificación: 15 Julio 2010, 06:21 am por Lord R.N.A. » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [Taller] Signals y Slots en Qt.
« Respuesta #1 en: 15 Julio 2010, 03:33 am »

Excelente, continúa con el taller, por favor, me gustaría ponerle interfaz a algunos problemas que tengo.

Ah, por cierto, deberías de especificar como compilar.

Yo hago esto:
Código:
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ ls -1
Ejemplo.cpp
Ejemplo.h
main.cpp
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ qmake -project
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ qmake *.pro
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ sudo make
g++ -c -pipe -fpermissive -g -Wall -W -D_REENTRANT -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o Ejemplo.o Ejemplo.cpp
Ejemplo.cpp:3:24: error: ui_Ejemplo.h: No existe el fichero ó directorio
make: *** [Ejemplo.o] Error 1
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$

Como ves, me da error con el ui_Ejemplo.h

Saludos.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: [Taller] Signals y Slots en Qt.
« Respuesta #2 en: 15 Julio 2010, 04:01 am »

Lo que sucede es que siempre he compilado con el QtCreator, pero desde que termine de cenar posteo como compilar.
En línea

cbug

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: [Taller] Signals y Slots en Qt.
« Respuesta #3 en: 15 Julio 2010, 04:53 am »

Muy bueno... Me quedo a la espera de como compilar  :xD
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: [Taller] Signals y Slots en Qt.
« Respuesta #4 en: 15 Julio 2010, 06:26 am »

Excelente, continúa con el taller, por favor, me gustaría ponerle interfaz a algunos problemas que tengo.

Ah, por cierto, deberías de especificar como compilar.

Yo hago esto:
Código:
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ ls -1
Ejemplo.cpp
Ejemplo.h
main.cpp
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ qmake -project
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ qmake *.pro
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$ sudo make
g++ -c -pipe -fpermissive -g -Wall -W -D_REENTRANT -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o Ejemplo.o Ejemplo.cpp
Ejemplo.cpp:3:24: error: ui_Ejemplo.h: No existe el fichero ó directorio
make: *** [Ejemplo.o] Error 1
leo@lein:~/Escritorio/c_proyect/qt_proyects/signals$

Como ves, me da error con el ui_Ejemplo.h

Saludos.

@LeoGutierrez: lo que sucede es que el QtCreator añade el #include "ui_ejemplo.h" por si quieres utilizar el QtDesigner pero soy un poco loco y prefiero hacer todo con codigo... solo tienes que quitar esa linea y compila correctamente. Por cierto la quite en el codigo, disculpen fue un error mio.

@cbug: Lo habia olvidado... ahora mismo pongo los pasos


1) qmake-qt4 -project
        
Esto se ejecuta dentro de la carpeta del proyecto con todos los ficheros a utilizar... esto creara un fichero *.pro.

2) qmake-qt4 *.pro

Esto creara un fichero llamado makefile.

3) make

Esto creara el programa funcional.
« Última modificación: 15 Julio 2010, 06:31 am por Lord R.N.A. » En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: [Taller] Signals y Slots en Qt.
« Respuesta #5 en: 15 Julio 2010, 10:04 am »

Muyyyyy bueno, hace ya mucho que buscaba un tutorial de este calibre y en castellano que te da menos cuelgue lerlo, pero en este caso son lecturas obligadas, no leerlo seria un delito ;)

Saludos
En línea

[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: [Taller] Signals y Slots en Qt.
« Respuesta #6 en: 15 Julio 2010, 14:39 pm »

Jaja, ya aprendiste a manejar Layouts con código, yo nunca aprendí, justo ahí le cogí gusto al Designer  :xD. Muy buen texto, seguiré leyendo si decides continuar escribiendo  :P.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: [Taller] Signals y Slots en Qt.
« Respuesta #7 en: 15 Julio 2010, 15:10 pm »

Jaja, ya aprendiste a manejar Layouts con código, yo nunca aprendí, justo ahí le cogí gusto al Designer  :xD. Muy buen texto, seguiré leyendo si decides continuar escribiendo  :P.

Saludos

:xD tenemos una pequeña diferencia... yo no se usar el Designer, me vuelvo un disparate.
En línea

sizeofc

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: [Taller] Signals y Slots en Qt.
« Respuesta #8 en: 18 Noviembre 2015, 01:39 am »

Hola necesito ayuda, tengo una aplicacion en la cual consiste en un formprincipal.cpp en el cual tiene un boton editar actionEditar que sirve para editar la fila seleccionada en un qtablewidget que se encuentra dentro del mismo formulario y al precionar dicho boton se abre un formulario llamado actualizaborrar en el cual tendria que cargar los datos de la fila seleccionada. y no se como hacerlo
lo que hago al precionar el boton editar es:

void formprincipal::on_actionEditar_triggered()
{

    actualizaBorrar formActualBorrar(this);//creao una instancia del la clase actualizaBorrar
    int resp;
    qDebug()<<"Item seleccionado: "<<getSelectItem();//esta funcion devuelve el item seleccionado

    formActualBorrar.setSelectItem(getSelectItem());//en esta linea intento setear el id a buscar en la base de datos con un metodo setselectItem

    resp= formActualBorrar.exec(); //muestro el formulario
 
    if(resp==QDialog::Rejected)
        return;                             //si en el formulario no presiono cancel seguiria actualizar los datos de la base de datos con los campos del formulario
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Slots QT « 1 2 »
Programación C/C++
overxfl0w13 15 7,740 Último mensaje 15 Julio 2012, 01:32 am
por avesudra
[QT][C++]Problema con slots que tienen argumentos.
Programación C/C++
anonimo12121 2 2,096 Último mensaje 13 Noviembre 2012, 22:29 pm
por anonimo12121
Signals Linux
GNU/Linux
jordibr7 1 1,618 Último mensaje 9 Diciembre 2013, 22:23 pm
por desikoder
Bordes redondeados vs no redondeados (Slots de items del Inventario de mi juego)
Foro Libre
z3nth10n 4 2,057 Último mensaje 26 Diciembre 2013, 15:38 pm
por z3nth10n
Slots de RAM en H110M-E Asus, ¿Dañados?. Un problema agregado
Hardware
n-utz 5 3,522 Último mensaje 9 Mayo 2017, 12:52 pm
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines