Qt信号槽的5种连接方式

一、概述

信号和槽要建立连接,本质上是通过 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.hmainwindow.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 种方式]");
    });
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰搞电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值