Características y uso de señales y slots QT.

1. Concepto:

信号( Signal )就是在特定情况下被发射的事件 , 例如 PushButton 最常见的信号就是鼠标单
击时发射的 clicked() 信号。
槽( Slot )就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分( publicprivateprotected ),可以具有任何参数,也可以被直接调用。
槽函数与一般的函数不同的是 :槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行 。

El compilador de metaobjetos (MOC) de Qt es un preprocesador que convierte estos programas con funciones de Qt en un formato estándar compatible con C++ antes de compilar el programa fuente y luego compilarlo con el compilador estándar de C++. Es por eso que se debe agregar una macro Q_OBJECT a una clase que usa el mecanismo de señal y ranura. Solo agregando esta macro se puede moc preprocesar la señal y el código de ranura en la clase.

En cuanto al uso de señales y tragamonedas, existen algunas reglas a las que prestar atención.
(1) Se puede conectar una señal a varias ranuras:

connect (spinNum, SIGNAL(valueChanged(int)), this , SLOT(addFun(int)) ;
connect (spinNum, SIGNAL(valueChanged (int)), this , SLOT(updateStatus (int));

Cuando las funciones de señal y ranura tienen parámetros, el tipo de parámetro debe indicarse en la función connect(), pero no es necesario escribir el nombre del parámetro.

(2) Se pueden conectar varias señales a la misma ranura:

connect (ui->rBtnBlue , SIGNAL (clicked()) , this, SLOT (setTextFontColor ()));
connect (ui->rBtnRed , SIGNAL (clicked()) , this , SLOT (setTextFontColor ())) ;
connect (ui->rBtnBlack , SIGNAL (clicked()), this , SLOT (setTextFontColor ()));

(3) Una señal se puede conectar a otra señal:

connect (spinNum, SIGNAL(valueChanged (int)), this , SIGNAL (refreshinfo(int)) ;

(4) Estrictamente hablando, el número y tipo de parámetros de la señal y la ranura deben ser consistentes. Al menos los parámetros de la señal no pueden ser menores que los parámetros de la ranura
. Si no coinciden, se producirá un error de compilación o de tiempo de ejecución.

(5) En clases que utilizan señales y ranuras, se debe agregar la macro QOBJECT a la definición de clase.

(6) Cuando se emite una señal, su función de ranura asociada generalmente se ejecuta inmediatamente, como una llamada normal a una función.
Solo después de que se hayan ejecutado todas las funciones de ranura asociadas con la señal, se ejecuta el código que sigue a la señal.

class QMyClass : public QObject
{
    
    
	QOBJECT//引用信号与槽时候,必须引用
public//构造函数
    Widget(QWidget *parent = nullptr);
    //析构函数
    ~Widget();
private//
protected:
	//
private slots:	
	//
}

2. Diferentes formas de parámetros de la función connect():

(1)一种参数形式的函数原型是:
connect(sender , SIGNAL(signal()), receiver, SLOT (slot())) ;

Características: Las macros SIGNAL() y SLOT() se utilizan aquí para especificar funciones de señal y ranura, y si las funciones de señal y ranura tienen parámetros, también se deben especificar los tipos de parámetros.

connect (sender , SIGNAL(valueChanged (int)), this , SLOT(updateStatus (int) );
(2)另外一种参数形式的函数的原型是 :

Objetos aplicables: para señales y ranuras con parámetros predeterminados (es decir, el nombre de la señal es único, no hay dos señales con parámetros diferentes pero con el mismo nombre), puede utilizar este formulario de puntero de función para asociar, como por ejemplo:

connect (lineEdit,&QlineEdit::textChanged ,this, &widget::on_textChanged);
(3)易错点:
而对于具有不同参数的同名信号就不能采用函数指针的方式进行信号与槽的关联,例如QSpinBox() 有两个 valueChanged()信号 :
在这里插入图片描述

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44236302/article/details/124310582
Recomendado
Clasificación