一、概述
信号和槽要建立连接,本质上是通过 connect 函数来连接实现的。但是从写法或者操作上来说,有多种方式,以下总结了 5 种方式:
SIGNAL
/SLOT(Qt4)
- 函数地址
(Qt5)
UI
设计师界面 - 转到槽UI
设计师界面 - 信号槽编辑器lambda
表达式
大家可根据自己的喜好自行选择。
二、SIGNAL
/SLOT(Qt4)
通过 SIGNAL/SLOT
这两个宏,将函数名以及对应的参数,转换为字符串,这是 Qt4
中使用的方式,当然在 Qt5
中也是兼容支持它的:
connect(sender,
SIGNAL(signal()),
receiver,
SLOT(slot()));
其中:
sender
信号发送者SIGNAL(signal())
发送的信号。SIGNAL
宏将信号转换成字符串receiver
信号接收者SLOT(slot())
槽函数。SLOT
宏将槽函数转换成字符串
示例代码
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1.使用 SIGNAL/SLOT 的方式连接信号和槽
connect(ui->btnMax,
SIGNAL(clicked()),
this,
SLOT(showMaximized()));
}
优缺点:
优点:
- 松耦合设计
- 动态绑定支持
缺点: - 编译不检查
- 缺乏模板支持
- 语法冗长
三、函数地址(Qt5)
这种方式中,信号和槽都使用函数的地址,如下:
connect(sender, &Sender::signal, receiver, &Receiver::slot);
其中:
sender
信号发送者&Sender::signal
发送的信号receiver
信号接收者&Receiver::slot
槽函数
示例代码
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 2.使用函数地址的方式连接信号和槽
connect(ui->btnNormal,
&QPushButton::clicked,
this,
&QMainWindow::showNormal);
}
四、 UI
设计师 - 转到槽
选择 clicked()
,即可生成并跳转到槽函数,即可在 mainwindow.h
和 mainwindow.cpp
中生成对应的代码,如下:
// mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
...
private slots:
void on_btnMin_clicked();
};
// mainwindow.cpp
void MainWindow::on_btnMin_clicked()
{
this->showMinimized();
}
注意:如果修改了按钮的 name,那么槽函数的名字也要随之修改。
五、 UI
设计师 - 信号槽编辑器
此时,我们的代码文件并没有修改,而是修改了 mainwindow.ui 文件,如下:
六、 Lambda
表达式
槽函数还可以直接写成 lambda
表达式的形式。C++11
引入了 lambda
表达式,用于定义并创建匿名的函数对象,可以使代码更加的简洁。lambda
表达式在现代语言中,非常的普遍。比如 java、python、kotlin
等语言都是支持 lambda
表达式的。Qt 是基于 C++ 的一个 GUI 框架,它完全支持 C++ 的语法,因此在 Qt 中也是可以使用 lambda 表达式的。学习 Qt 多多少少都需要了解一些 C++ 的语法。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 5. 使用lambda 表达式做槽函数
connect(ui->btnSetWindowTitle, &QPushButton::clicked, this, [this]() {
this->setWindowTitle("[连接信号槽的 5 种方式]");
});
}