QT信号槽的4⃣️种写法

笔记 / 2021-06-29

什么是信号槽

信号槽是QT中特有的通信手段,可以说是一种绑定手段。
也可以理解为面向未来编程。在未来某个时间段发出了某个信号出发了某个条件。

小红:今晚来我家?
小王:ok

包含四个对象

  • 发送者
  • 干啥信号
  • 接收者
  • 应答槽函数

1⃣️ 通过QT设计师直接操作实现

image.png
image.png
image.png

2⃣️ 通过connect函数实现1 -- 传统写法(已过时)

⚠️此方法为QT5之前的写法,已经过时这里不推荐

首先注册一个槽函数

private slots:
    void slot_close_window();

然后实现槽函数

void MainWindow::slot_close_window()
{
    this->close();
}

最后通过connect函数链接

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 链接 传统写法不推荐
    // 谁发出信号 发出什么信号 谁处理 怎么处理 
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(slot_close_window()));

}

3⃣️ 通过connect函数实现2 --地址写法(QT5推荐)

前面操作与方法2⃣️相同,声明实现槽函数。这里不详细概述

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 谁发出信号 发出什么信号 谁处理 怎么处理
    // QT5 写法推荐
    connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::slot_close_window);

}

⚠️这里需要注意

  • 发送者对象信号是类方法
  • 接收者槽是实例方法
  • 只是取函数地址 不需要执行函数(不用加括号)

4⃣️ 通过connect函数实现3 --lambda表达式方式(简短处理)

这里应用于简短功能实现,代码量相对较少的情况下

在方法3⃣️的基础上将槽修改为lambda表达式即可
示例代码

    // 写法一 在原来基础上修改槽函数为 lambda表达式 传递 this引用  4个参数
    connect(ui->pushButton,&QPushButton::clicked,this,[&]{
        this->close();
    });
    // 写法二 直接将最后两个参数替换为 lambda表达式 同时捕获 this  3个参数
    connect(ui->pushButton,&QPushButton::clicked,[this]{
        this->close();
    });