信号槽(Qt)

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

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值