Qt5的信号和槽函数

1、 Qt5的信号和槽函数

Qt Creator的帮助手册中对信号和槽函数(signals&slots)描述如下:

Signals and slots are used for communication between objects. The signals and slots mechanism is a central feature of Qt and probably the part that differs most from the features provided by other frameworks. Signals and slots are made possible by Qt’s meta-object system.
信号和槽函数用于对象间的通信,是Qt和其他开发平台相区别的最主要的特性

Qt5作为c++的GUI开发类库,其最具代表性的特点就是信号和槽,这两者类似于中断和中断处理函数调用的回调(callback)函数,但具体实现在应用层,并且使用起来较后者更为方便。
在这里插入图片描述

2、信号和槽函数(signals&slots)的用处

如前所述,signals&slots可以用于对象间的通信。实际上常用于对GUI窗体上各种事件的及时处理,譬如:

a:文本框

文本框的内容被修改后会有一个名为valueChangedsignal,我们如果希望在文本框的内容被修改后把内容保存到文件里,就可以将程序设计为“用一个slots函数(假设为funcA)和valueChanged这个信号相关联,每个valueChanged信号被发出的时候,都调用这个funcA将文本框中的内容保存到指定的文件里”。

b:按键

每次某个按键按下后都调用一个函数funcB,假设按键按下后发出一个信号signalB,这个时候funcB就是slots,signalB就是signals

c:自定义signal和slots

假设有两个class,分别为学生Student和老师Teacher。希望每次老师拍桌子的时候学生就坐端正。用函数描述就是每次Teacher类的对象调用“拍桌子”这个函数的时候,所有的学生类的对象就调用“坐端正”这个函数。

在上面这个例子中,拍桌子函数被调用就会发出signals,学生对象将调用坐端正这个slots来响应

3、关联信号和槽函数

通常在接收信号并调用槽函数的对象的类的构造函数(constructor)中,调用connect函数实现信号与槽的关联。

connect()函数的一种参数表如下所示:

connect(sender, &SenderObject::signalFuncton, this, &ReceiverObject::slotsFunction);

sender:发送信号的对象
&SenderObject::signalFuncton:信号函数指针
&ReceiverObject::slotsFunction:槽函数指针

4、声明信号和槽函数

用代码实现2.c老师和学生的例子

老师的信号:

class Teacher{
	...
signals:
	void BeatTheDeskSignal();
	...

};

注:信号必须是无返回值的函数。


学生的slots:

class Student{
	...
private:
	Teacher _teaA;
	...
private slots:
	void SitDown(int val);
	...

};

学生的connect:

Student::Student()
{
	...
	
	
	connect(_teaA,&Teacher::BeatTheDeskSignal,this,&Student::SitDown);
	...
}

5、发射信号

signals在发出后由slots响应,使用关键字emit发射signals,譬如可以在Teacher中添加一个函数“拍桌子”,用来发射BeatTheDeskSignal这个signasl:

void Teacher::BeatTheDesk()
{
	emit BeatTheDeskSignal();
}

至此,每次Teacher的对象调用BeatTheDesk,就会发射一个BeatTheDeskSignal信号,对应的Student对象就会调用SitDown函数来响应。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页