Qt_信号与槽
目录
1、 信号与槽的概述
1.1 信号的本质
1.2 槽的本质
2、连接信号和槽
3、使用connect函数
4、自动生成槽函数
结语
前言:
信号与槽是Qt中一个重要概念,他解释了用户对界面的操作产生不同效果的原因。信号是由某个信号源(控件)发出,槽表示收到信号后所执行的具体动作,信号与槽相互结合使用,就可以让界面实现各式各样的DIY效应。
1、 信号与槽的概述
我们在使用任何界面时,每次鼠标点击不同的控件,都会产生不同的效果,在Qt中是依靠信号与槽来完成此功能的。当点击控件时,可以理解为产生了一个事件,与此同时Qt就会让该控件类发出一个信号,并且该信号是Qt内置好的。但是只发出信号是无法完成任何工作的,要对这个信号自定义一个行为,表示当信号发出时会执行某个动作,这才是信号发出的意义。
所以槽的作用就体现出来了,不过槽仅仅是定义一个动作,想让信号发出后执行这个动作,还需要将信号和槽进行连接,因此一个完整的信号与槽是:信号发出-槽定义-连接信号和槽。举个例子,当点击界面上的关闭按钮时,会将该界面关闭,整体逻辑:点击按钮会发出了一个信号,该信号会触发事先连接好的槽,该槽的动作是关闭当前界面,所以给用户的体验是点击按钮界面关闭。具体示意图如下:
1.1 信号的本质
综上所述,信号的产生是因为用户对控件的操作,以至于让控件产生了事件,Qt识别到事件产生了因此就会让该控件发出信号,所以信号的本质是产生了事件。在界面中产生事件的方式有多种,比如:
1、鼠标单击按钮或者双击按钮。
2、鼠标移动到某个控件上,或者从控件上移走。
3、鼠标的点击、释放。
4、键盘的输入。
在代码中,信号被抽象的当作是一个函数,所以发出信号即调用该函数,况且控件在代码中也是被抽象成类的,所以这些信号函数是存放在控件类中的。因此一个控件发出信号,实际上就是去调用该控件类里的对应信号函数,
1.2 槽的本质
槽的本质也是函数,因此可以把信号与槽的连接看成当信号函数被调用时会自动去调用槽函数,类似一种回调机制。只不过槽函数必须定义在类中,可以在类的任何位置。和其他成员函数不同的是,槽函数与对应信号相连接后,会在信号发出时自动被调用。
和信号函数不同的是,槽函数需要实现定义,但是信号函数只要有声明即可,只是目前信号函数是Qt帮我们内置好了的,所以我们不需要关心信号函数,当进行自定义信号函数时才需要注意这一点。
2、连接信号和槽
connect函数专门用于连接信号和槽,该函数是QObject类提供的,几乎所有常用控件都是直接或间接继承QObject,包括QWidget类也是继承自QObject,因此connect函数可以在Widget类下直接调用。
继承关系图:
connect函数原型:
connect (const QObject *sender,
const char * signal ,
const QObject * receiver ,
const char * method ,
Qt::ConnectionType type = Qt::AutoConnection )
//sender 表示信号源,即信号从哪个控件发出的
//signal 表示具体信号函数的地址
//receiver 表示槽函数所在类的地址,抽象来看就是处理该信号的类的地址
//method 表示槽函数的地址
//type 表示连接方式,一般而言不需要程序员手动传该参数
3、使用connect函数
以下实现一个按钮,通过点击该按钮可以在输出窗口中打印信息,代码实现如下(节选widget.cpp代码):
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* PushButton = new QPushButton("打印",this);
//clicked是QPushButton的内置信号函数,所以这里可以直接用
connect(PushButton,&QPushButton::clicked,this,&Widget::Print);
}
Widget::~Widget()
{
delete ui;
}
void Widget::Print()
{
qDebug()<<"此槽函数被调用"<<endl;
}
运行结果:
另外说明:clicked信号函数表示当按钮被鼠标点击一次后发送该信号(点击一次包含点击+松开)。
4、自动生成槽函数
上述代码中的槽函数是我们自己实现的,需要手动写出槽函数的声明和定义,还有一种方法可以更方便的生成槽函数,就是用界面的方式生成槽函数,步骤如下:
1、进入ui界面,将按钮控件拖到界面中生成按钮实体,右键点击按钮选择传到槽:
2、然后选择clicked信号点击OK:
3、此时会自动跳转到widget.cpp文件中,并且在widget.h内可以发现槽函数的声明已经自动生成了,我们只需要实现槽函数的定义即可:
4、最终的测试结果:
并且整个过程中不需要我们手动调用connect函数进行信号与槽的连接,系统会自动帮我们建立连接。
结语
以上就是关于信号与槽的讲解,信号与槽是Qt中非常重要的概念,虽然其理解起来相对容易,但是他却悄无声息的贯穿整个开发过程,并且是实现用户和界面交互的重要手段。
最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!