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
//Ejemplo.h #ifndef EJEMPLO_H #define EJEMPLO_H #include <QtGui> class QSpinBox; class QSlider; class QLabel; class QVBoxLayout; class QHBoxLayout; class Ejemplo : public QWidget { Q_OBJECT signals: void setRGB(int,int,int); private slots: void getRGB(int,int,int); void setRed(int); void setGreen(int); void setBlue(int); void setAlpha(int); private: short int red, green, blue, alpha; QSpinBox *SpinRed, *SpinGreen, *SpinBlue; QSlider *SliderRed, *SliderGreen, *SliderBlue; QLabel *LabelRed, *LabelBlue, *LabelGreen; QVBoxLayout *LeftVertical, *MiddleRightVertical, *MiddleLeftVertical; QHBoxLayout *MainHorizontal; public: Ejemplo(QWidget *parent = 0); }; #endif // EJEMPLO_H
Código
//Ejemplo.cpp #include "ejemplo.h" Ejemplo::Ejemplo(QWidget *parent) : QWidget(parent) { //Construimos los Slider que utilizaremos. this->SliderBlue = new QSlider(Qt::Vertical,0); this->SliderBlue->setMinimum(0); this->SliderBlue->setMaximum(255); this->SliderRed = new QSlider(Qt::Vertical,0); this->SliderRed->setMinimum(0); this->SliderRed->setMaximum(255); this->SliderGreen = new QSlider(Qt::Vertical,0); this->SliderGreen->setMinimum(0); this->SliderGreen->setMaximum(255); //Construimos los SpinBox que utilizaremos. this->SpinRed = new QSpinBox; this->SpinRed->setMinimum(0); this->SpinRed->setMaximum(255); this->SpinBlue = new QSpinBox; this->SpinBlue->setMinimum(0); this->SpinBlue->setMaximum(255); this->SpinGreen = new QSpinBox; this->SpinGreen->setMinimum(0); this->SpinGreen->setMaximum(255); //Construimos los Labels. this->LabelBlue = new QLabel("Azul"); this->LabelGreen = new QLabel("Verde"); this->LabelRed = new QLabel("Rojo"); //Construimos los Layout para Organizar. this->LeftVertical = new QVBoxLayout; this->MiddleLeftVertical = new QVBoxLayout; this->MiddleRightVertical = new QVBoxLayout; this->MainHorizontal = new QHBoxLayout; //Vamos agregando los Objetos a los Layout. this->LeftVertical->addWidget(this->LabelRed); this->LeftVertical->addWidget(this->SpinRed); this->LeftVertical->addWidget(this->SliderRed); this->MiddleLeftVertical->addWidget(this->LabelGreen); this->MiddleLeftVertical->addWidget(this->SpinGreen); this->MiddleLeftVertical->addWidget(this->SliderGreen); this->MiddleRightVertical->addWidget(this->LabelBlue); this->MiddleRightVertical->addWidget(this->SpinBlue); this->MiddleRightVertical->addWidget(this->SliderBlue); this->MainHorizontal->addLayout(this->LeftVertical); this->MainHorizontal->addLayout(this->MiddleLeftVertical); this->MainHorizontal->addLayout(this->MiddleRightVertical); this->setLayout(this->MainHorizontal); this->setWindowTitle("Cambia el Fondo(Codigo de Ejemplo)"); this->MainHorizontal->addStretch(); this->setFixedHeight(this->sizeHint().height()); this->red = 0; this->blue = 0; this->green = 0; this->alpha = 0; //Realizamos las conexiones que necesitaremos. connect(this->SpinRed,SIGNAL(valueChanged(int)),this->SliderRed,SLOT(setValue(int))); connect(this->SpinGreen,SIGNAL(valueChanged(int)),this->SliderGreen,SLOT(setValue(int))); connect(this->SpinBlue,SIGNAL(valueChanged(int)),this->SliderBlue,SLOT(setValue(int))); connect(this->SliderRed,SIGNAL(valueChanged(int)),this->SpinRed,SLOT(setValue(int))); connect(this->SliderGreen,SIGNAL(valueChanged(int)),this->SpinGreen,SLOT(setValue(int))); connect(this->SliderBlue,SIGNAL(valueChanged(int)),this->SpinBlue,SLOT(setValue(int))); connect(this->SliderRed,SIGNAL(valueChanged(int)),this,SLOT(setRed(int))); connect(this->SliderGreen,SIGNAL(valueChanged(int)),this,SLOT(setGreen(int))); connect(this->SliderBlue,SIGNAL(valueChanged(int)),this,SLOT(setBlue(int))); connect(this,SIGNAL(setRGB(int,int,int)),this,SLOT(getRGB(int,int,int))); emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color. } void Ejemplo::setAlpha(int change) { this->alpha = change; emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color. } void Ejemplo::setRed(int change) { this->red = change; emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color. } void Ejemplo::setGreen(int change) { this->green = change; emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color. } void Ejemplo::setBlue(int change) { this->blue = change; emit setRGB(this->red,this->green,this->blue); //Enviamos una señal para cambiar el color. } void Ejemplo::getRGB(int red, int green, int blue) { QColor *Background = new QColor(red,green,blue,255); QPalette *Paleta = new QPalette; Paleta->setColor(QPalette::Background,Background->convertTo(QColor::Rgb)); this->setPalette(*Paleta); }
Código
//main.cpp #include <QtGui/QApplication> #include "ejemplo.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Ejemplo w; w.show(); return a.exec(); }