1. 信号槽的概念
信号槽是Qt基于C++语法上新增的特性,可以实现对象之间的通信,形成一定因果关系。
使用信号槽的对象需要具备两个条件:
● 通信的对象必须继承自QObject
● 类中要有Q_OBJECT宏
2. 函数原型
QObject类是所有Qt对象的基类,此类中有一个静态成员函数connect,用于连接信号槽之间的因果关系,函数原型如下:
参数1:发射者,通信的对象,此对象是信号槽触发的来源,例如:按钮对象(n.)
参数2:信号函数,使用SIGNAL()包裹,表示发射者触发的效果,例如:点击(v.)
参数3:接收者,通信对象,此对象是执行结果代码的主体(n.)
参数4:槽函数,使用SLOT()包裹,表示接收者要执行的函数(v.)
为了方便讲解各种场景下使用信号槽的不同方式,分别使用三种类型进行讲解:
● 自带信号 → 自带槽
● 自带信号 → 自定义槽
● 自定义信号 → 槽函数
2.1 自带信号 → 自带槽
这是最简单的一种连接方式,因为信号函数和槽函数都在Qt中预设了,只需要通过connect函数“连线”即可。
【例子】点击按钮,关闭窗口。
分析:
参数1,按钮对象;
参数2,点击函数;
参数3,窗口对象;
参数4:关闭函数。
dialog.h
dialog.cpp
2.2 自带信号 → 自定义槽
这种方式是使用频率最高的一种连接方式,因为Qt源代码中不可能囊括所有要执行的代码。实际上槽函数是一种特殊的成员函数,编写方式基本等同成员函数。
【例子】点击按钮,左下角移动窗口并输出移动后的窗口坐标。
dialog.h
dialog.cpp
结果如图所示:
每次点击按钮向右向下移动10个像素
2.3 自定义信号
自定义信号主要用于后期一些相对复杂的通信场景,本次学习强行使用,并不是功能实现的最优解。
信号函数是非常特殊的一种函数,只有声明,没有定义,且不能在代码中直接调用,可以配合emit关键字进行发射。
【例子】点击按钮,关闭窗口。
dialog.h
dialog.cpp
结果如下:
点击“关闭”按钮即可关闭窗口。
3. 参数传递
【例子】点击按钮,按钮上显示点击的次数。
提示:
QPushButton显示文字的属性:
● text : QString
getter:QString text() const
setter:void setText(const QString & text)
3.1 全局参数
本次使用成员变量作为一个对象内部的全局参数,根据实际情况也可以使用静态变量。
dialog.h
dialog.cpp
运行结果如下:每按一次按钮计数+1
3.2 信号槽传参
使用信号槽也可以进行参数传递,但是这种方式通常用户后面较为复杂的情况,本次讲解的代码也不是最优解。
dialog.h
dialog.cpp
运行结果:每按一次按钮计数+1
需要注意的是:
1. 理论上可以通过信号槽发送任意多个参数
2. 信号函数的参数个数必须大于等于槽函数的参数个数
3. 参数类型必须一致
4. 对应关系
4.1 一对多
同一个信号可以同时连接多个槽函数,也可以把这多个槽函数合并为一个槽函数。
dialog.h
dialog.cpp
运行结果如下
4.2 多对一
多个信号可以连接到同一个槽函数。
dialog.h
dialog.cpp
运行结果如下: