Qt学习-信号与槽
Qt学习-信号与槽
本章节将介绍使用Qt4信号与槽。信号与槽作为QT的核心机制在QT编程中有着广泛的应用,因为信号与槽是Qt里面的最基础而且是最重要的部分。
-
信号、槽是啥?
古有“烽火狼烟”传递消息,敌人来犯的消息迅速传达开来,是多么的聪慧啊。在烽火台上点燃“燃料”,烟就是信号;下一个燃火台看到烟后就点燃燃料,这个就槽。
比如:一个按钮被点击了,会触发一个点击的信号,槽是指收到信号之后做什么。
专业点说你可以从设计模式上理解,其实就是观察者模式。信号是“主题”,每个槽是“观察者”。当发出信号的时候,对该信号感兴趣的槽就会被触发,简单点说信号类似广播,每个槽都可以听到这个广播,但是只有你连接过的槽才会去接收这个信号,并作出相应的操作。
信号(Signal):就是在特定情况下被发射的事件
槽(Slot):就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。
-
查看Qt中的信号与槽
(1)打开Qt-Create,点击帮助按钮
(2)到了帮助页,点击切换成索引,在查找里面输入需要查询的控件名,并回车,显示查询的结果
(3)查看QPushButton类时,在内容页中未看到具体的信号槽类,这时候需要到它的基类中查找
(4)这时候就能在基类中查找到对应的公有信号和槽,点击他们跳转到对应的可用的信号和槽
(5)点击上图的信号/槽,就会跳到具体的位置。
-
Qt中的信号与槽的关联
使用QT开发时,通常使用connect函数关联信号与槽,在帮助文档中的基本格式是
简写可以写成:
connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));
其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。
SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。
Qt Creator信号槽示例
为了体验一下信号槽的使用,我们以一段简单的代码说明:
新建一个Qt-QWidget工程(关于新建工程步骤参考qt-环境搭建与测试)
标准信号槽使用
(1)创建好工程后,双击进去mywidget类中
(2)创建好工程后,在MyWidget类中,包含按钮的头文件#include <QPushButton>,并且创建QPushButton的按钮指针对象。
(3)切换到MyWidget类的Cpp中,也可以使用快捷键 “F4”,初始化窗体和创建按钮对象,并初始化按钮参数,如图:
(4)标准信号槽的使用,利用connect函数,当按钮按下时,也就是pressed通过F1帮助文档查询,关闭窗口,如果所示:
自定义槽函数使用
有时候,我们希望按下按钮后实现自己的功能,那么在这里就需要用到自定义槽函数
(1) 切换到MyWidget类的h中,要使用自定义槽函数,必须加上public slots关键字,并设置槽函数,这里创建第二个按钮用于演示,如图所示:
(2) 切换到MyWidget类的cpp中,初始化按钮b2,并且b2的点击事件关联到刚才写的自定义槽函数,自定义槽函数可以是任意的成员函数,必须和信号的参数和返回值保持一致,没有返回值
(3) 实现自定义槽mySlotTest 的功能,改变按钮b1的文字
(4) 查看测试结果
信号槽总结:
- 发送者和接收者都需要是QObject的子类
- 信号是一个函数声明,返回 void,不需要实现函数代码
- 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
- 使用QObject::connect()函数连接信号和槽。
Qt5在语法上兼容Qt4
格式:
connect(sender, &Send::signal, receiver, &Receiver::slot);
connect(信号发出者对象(指针), &className::clicked, 信号接收者对象(指针), &classB::slot);