一、介绍
1、介绍信号和槽
在之前的按钮使用中我们初步认识了信号和槽。简单来说就是:
信号源:哪个控件发出的信号。
信号类型:用户对控件的不同操作发出不同的信号。
信号处理方式:槽(对应的回调函数)
2、介绍关联函数 connect
connect 函数:Q_OBJECT 宏自带的静态函数,用于关联信号和槽。
下图是 connect 定义:
const QObject* sender :信号源
const char* signal :信号源发出的信号类型
QObjecct* recever :处理信号者
const char* method :处理信号方式
下图是一个简单的 connect 函数使用:
但是我们提到槽其实是一个函数,上面的 connect 函数参数是 const char* ,这是怎么回事呢?
其实在早期传入信号和槽是需要调用宏来实现的,宏的作用就是把函数指针转成字符串,新版的 connect 函数重载了一个新的:
定义了模板传入的就是任意类型的函数指针。
二、自定义槽函数
上面简单使用 connect 是用的控件默认的信号和槽,下面介绍如何自定义槽函数。
槽函数就是处理信号的回调函数,有两种定义方式。
1、定义成成员函数
widget.h:
widget.cpp:
结果:
2、ui 界面点击定义
上面是堆定义按钮实现按钮按下的槽函数,这里实现拖拽按钮定义槽函数。
ui 界面:
右击控件,选择转到槽:
双击信号 clicked(bool),自动转到定义函数文件 widget.cpp:
结果:
三、自定义信号
1、介绍信号
信号也是一类特殊的函数。
程序员只写出信号的声明并告诉 Qt 这是一个信号函数。函数的定义由 Qt 自动生成,程序员无法干预。
信号函数返回值一定是 void,参数随意,可以重载。
2、自定义信号
widget.h:
signals:就代表我要定义信号函数了。
对应还要实现槽函数 handlerMySignal()
widget.cpp:
实现完槽函数之后,关联槽和信号,
不同于内置信号,用户对控件做出特定行为自动发射信号,自定义信号用 emit 信号 的方式指定位置发射信号调用槽函数。
结果:
四、带参数的信号和槽
信号的参数会作为实参传到槽函数的参数进行逻辑处理。
所以信号和槽对应参数类型一定要一致,但是信号的参数大于等于槽函数的参数,这么做的目的是多个信号对应一个槽函数。
槽函数按顺序拿前 n 个参数。
widget.h:
widget.cpp:
结果:
五、断开连接 disconnect
使用方法和 connect 基本一样,当一个信号要换一个槽函数的时候就需要先断开连接再连接。
widget.h:
widget.cpp:
逻辑就是一个按钮可以改变窗口名字,一个按钮可以改变那个按钮原本的窗口名字。
结果:
先点击修改窗口标题
再点击切换按钮功能后点击修改窗口标题:
六、槽函数 lambda 表达式
和 C++11 的方法一样,不赘述。