6 信号和槽

6.1 什么是信号和槽?

信号和槽是Qt自行定义的一种通信机制,实现对象间的数据交互。当用户或系统触发了一个动作,导致某个组件的状态发生了改变,该组件就会发射一个信号,即调用其类中一个特定的成员函数,同时还可能携带必要的参数。槽和普通成员函数几乎没有太多区别,可以是公有、保护或私有的,可以被重载,也可以被覆盖,其参数可以是任意类型,并可以像普通成员函数一样被调用。槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种特定信号的处理,可以将槽和其它对象的信号建立连接。当发射信号时,槽函数将被触发和执行,进而实现特定的功能。

6.2 如何定义信号?

定义信号类似下面这个样子:

信号函数只需声明,不要定义。

6.3 如何定义槽?

定义槽类似下面这个样子:

槽函数可被连接到某个信号上。信号发射时,槽函数被执行。槽函数可以被直接调用。

6.4 如何连接信号和槽?

用于连接信号和槽的connect方法:

6.5 案例

点击按钮关闭窗口。

C:\Users\Minwei\Projects\Qt\Close\main.cpp:

运行效果如图所示:

6.6 信号和槽的语法要求

原则上,信号函数和槽函数的参数表应严格一致,比如:

但有两个例外。一个是当槽函数的参数带有缺省值时,比如:

另一个是当信号函数的参数多于槽函数时,比如:

这时,多余参数将被忽略。

6.7 信号和槽的特殊用法

一般情况下,将一个信号连接到一个槽,已可以满足大多数应用开发的需要。但有时我们也需要将一个信号连接到多个槽,即信号广播,比如:

或者将多个信号连接到一个槽,即信号汇集,比如:

甚至将一个信号再连接到另一个信号,即信号级联,比如: