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:文本框
文本框的内容被修改后会有一个名为valueChanged的signal,我们如果希望在文本框的内容被修改后把内容保存到文件里,就可以将程序设计为“用一个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函数来响应。