文章目录
- [1. 信号](#1. 信号)
- [2. 槽的本质](#2. 槽的本质)
- [3. 信号和槽的使用](#3. 信号和槽的使用)
-
- [3.1 连接信号和槽](#3.1 连接信号和槽)
1. 信号
Linux
信号Signal
:系统内部的通知机制,进程间通信的方式
- 信号源:谁发的信号。
- 信号的类型:哪种类别的信号。
- 信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行。
Qt
中的信号和Linux
中的信号,虽然不是一样的概念,但是确实有相似之处
Qt
中,谈到信号,也是涉及到三个要素。
信号源:由哪个控件发出的信号。
信号的类型:用户进行不同的操作,就可能触发不同的信号。
点击按钮,触发点击信号。
在输入框中移动光标,触发移动光标的信号。
勾选一个复选框
选择一个下拉框都会触发出不同的信号。
信号的处理方式:
槽(slot)=>函数
Qt
中可以使用connect
这样的函数,把一个信号和一个槽关联起来,后续只要信号触发了,Qt
就会自动的执行槽函数。
一定是先把信号的处理方式准备好,再触发信号。
Qt
中,一定是先关联号信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了(错过了)

- 信号的本质:
信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时 Qt 对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。
在
Qt
中信号是通过什么形式呈现给使用者的呢?
我们对哪个窗口进行操作, 哪个窗口就可以捕捉到这些被触发的事件。
对于使用者来说触发了一个事件我们就可以得到
Qt
框架给我们发出的某个特定信号。信号的呈现形式就是函数, 也就是说某个事件产生了,
Qt
框架就会调用某个对应的信号函数, 通知使用者。在
Qt
中信号的发出者是某个实例化的类对象。
2. 槽的本质
槽(
Slot
)就是对信号响应的函数。槽就是一个函数,与一般的C++
函数是一样的,可以定义在类的任何位置(public
、protected
或private
),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。例如: "按钮被按下" 这个信号可以用
clicked()
函数表示,"窗口关闭" 这个槽可以用close()
函数表示,假如使用信号和槽机制实现:"点击按钮会关闭窗口" 的功能,其实就是
clicked()
函数调用close()
函数的效果。信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:
- 信号函数用
signals
关键字修饰,槽函数用public slots、protected slots
或者private slots
修饰。signals 和 slots
是Qt
在C++
的基础上扩展的关键字,专门用来指明信号函数和槽函数;- 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。
Qt
中提供的这些类,本身是存在一定的继承关系的。QObject
就是其他Qt
内置类的"祖宗"。信号函数的定义是
Qt
自动在编译程序之前生成的。编写Qt
应用程序的程序猿无需关注。这种自动生成代码的机制称为 元编程 (Meta Programming) 。这种操作在很多场景中都能见到。
3. 信号和槽的使用
3.1 连接信号和槽
connect
的具体用法:
cpp
bool connect(const QObject *sender,
const char *signal_,
const QObject *receiver,
const char *method,
Qt::ConnectionType type = Qt::AutoConnection);
参数说明:
sender
:信号的发送者;signal
:发送的信号(信号函数);receiver
:信号的接收者;method
:接收信号的槽函数;type
: 用于指定关联方式,默认的关联方式为Qt::AutoConnection
,通常不需要手动设定。
例子:在窗口中设置一个按钮,当点击 "按钮" 时关闭 "窗口"
图标带锯齿的是槽函数,如click
图标类似于wifi信号的是信号函数,如clicked

widget.cpp
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* button = new QPushButton(this);
button->setText("关闭");
button->move(200,200);
//click是一个slot函数,作用就是在调用的时候相当于点击了一下按钮
//clicked(过去分词形式,完事了,点完了),才是要触发的点击信号
//connect要求,前俩参数是匹配的.button的类型如果是QPushButton*
//此时,第二个参数的信号必须是QPushButton内置的信号(父类的信号),不能是一个其他的类,比如QLineEdit的信号~~
//close是QWidget内置的槽函数.Widget继承自QWidget,也就继承了父亲的槽函数
//close槽函数功能已经是人家内部实现好了,不需要咱们去关心。具体的作用就是关闭当前的窗口/控件。
connect(button,&QPushButton::clicked,this,&Widget::close);
}
Widget::~Widget()
{
delete ui;
}
运行:

点击后关闭