QT信号与槽的特点和用法

1. 概念:

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

Qt的元对象编译器 C Meta-0均ect Compiler, MOC )是一个预处理器,在源程序被编译前先将这些Qt 特性的程序转换为标准 C++兼容的形式 ,然后再由标准 C++编译器进行编译 。 这就是为什么在使用信号与槽机制的类里 ,必须添加一个 Q_OBJECT 宏的原因,只有添加了这个宏, moc 才能对类里的信号与槽的代码进行预处理 。

关于信号与槽的使用 , 有以下一些规则需要注意。
( 1) 一个信号可以连接多个槽:

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

当信号和槽函数带有参数时 , 在 connect()函数里,要写明参数的类型 , 但可以不写参数名称。

( 2 ) 多个信号可 以连接同 一个槽:

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 ) 一个信 号可 以连接另 外一个信号 :

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

( 4 )严格的情况下,信号与槽的参数个数和类型需要一致 , 至少信号的参数不能少于槽 的 参
数 。 如果不匹配,会出现编译错误或运行错误。

( 5 )在使用信号与槽的类中,必须在类的定义中加入宏QOBJECT。

( 6 ) 当一个信号被发射 时, 与其关联 的槽函 数通常被立 即执行,就像正常调用 一个函数一样 。
只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

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

2. connect() 函数的不同参数形式:

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

特点:这里使用了宏 SIGNAL()和l SLOT()指定信号和槽函数 , 而且如果信号和槽函数带有参数 , 还需注明参数类型

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

适用对象:对于具有默认参数的信号与槽(即信号名称是唯一的 , 没有参数不同而同名的两个信号) ,可以使用这种函数指针形式进行关联 ,如 :

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44236302/article/details/124310582