《QT学习笔记 —— 8. QT中的信号和槽》

在阅读本文之前,建议先花三五分钟阅读下《QT学习笔记 —— 2. 使用向导创建QT项目》

信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调

 

一、QT中标准信号和槽

03_SignalAndSlot.pro

《QT学习笔记 —— 8. QT中的信号和槽》

 

mainwidget.h

《QT学习笔记 —— 8. QT中的信号和槽》

 

main.cpp

《QT学习笔记 —— 8. QT中的信号和槽》

 

mainwidget.cpp

《QT学习笔记 —— 8. QT中的信号和槽》

编译运行结果如下:

《QT学习笔记 —— 8. QT中的信号和槽》

点击close按钮后,主窗口就关闭了。我们的代码逻辑就是这样的,点击close按钮,就会发送pressed信号,然后我们的主窗口就对pressed信号进行处理,是通过QT系统标准槽函数进行处理的,我们也可以自定义信号和槽函数。

信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。

注:信号没有返回值

 

下面简单说下,查看QT的帮助文档。

1. 将鼠标放到QPushButton上面,连续按两次F1,

《QT学习笔记 —— 8. QT中的信号和槽》

《QT学习笔记 —— 8. QT中的信号和槽》

 

2. 点击QAbstractButton,点击Signals

《QT学习笔记 —— 8. QT中的信号和槽》

《QT学习笔记 —— 8. QT中的信号和槽》

到这里我们就看到我们想看到的信号了。可以进去查看不同的信号,在什么场景被触发。

 

3. 退出帮助文档,按键盘左上角的ESC按键

 

一、QT中自定义槽函数

mainwidget.h

《QT学习笔记 —— 8. QT中的信号和槽》

mainwidget.cpp

《QT学习笔记 —— 8. QT中的信号和槽》

编译运行结果如下:

《QT学习笔记 —— 8. QT中的信号和槽》《QT学习笔记 —— 8. QT中的信号和槽》

自定义的槽函数,和普通的函数没有什么区别。可以是任意的成员函数,普通全局函数,静态函数。槽函数需要和信号一致(参数,返回值)。由于信号都是没有返回值,所以,槽函数一定没有返回值。

 

三、信号槽的更多用法

(1)一个信号可以和多个槽相连

如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的。

(2)多个信号可以连接到一个槽

只要任意一个信号发出,这个槽就会被调用

(3)一个信号可以连接到另外的一个信号

当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。