什么是信号槽
信号槽是QT中特有的通信手段,可以说是一种绑定手段。
也可以理解为面向未来编程。在未来某个时间段发出了某个信号出发了某个条件。
小红:今晚来我家?
小王:ok
包含四个对象
- 谁
发送者
- 干啥
信号
- 谁
接收者
- 应答
槽函数
1⃣️ 通过QT设计师
直接操作实现
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();
});