Bootstrap

【Qt 信号和槽】一篇文章带你详细的了解 Qt 的信号与槽

1. 信号和槽的基本概念

  • 信号(Signal)🐧

信号是由对象发出的,表示某个事件发生。信号本身不包含任何实现代码,只是一个声明

例如 按钮被点击、文本框内容改变等事件 都可以通过信号来表示。

信号可以带参数,也可以不带参数。

注意:❗在Qt中,一定是先关联信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了;

在这里插入图片描述


  • 槽(Slot)🐧

槽是一个普通的成员函数,但它可以与信号连接。当信号被发出时,连接到该信号的槽会被自动调用。

槽可以执行任何合法的操作,比如更新用户界面、处理数据



2. connect ()函数的用法 🍎

🐧connect ( )QObject这个类提供的 静态成员函数

🐧简单介绍一下QObject这个类:🔍

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


2.1 小案例
  • 通过按下按钮,实现关闭窗口的功能 🐧
#include "widget.h"
#include "ui_widget.h"

#include <QPushButton>

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

    QPushButton* mybutton = new QPushButton(this);

    mybutton->setText("关闭窗口按钮");

    mybutton->move(300, 200);

    connect(mybutton, &QPushButton::clicked, this, &QWidget::close);

}

Widget::~Widget()
{
    delete ui;
}

在这里插入图片描述


2.2 小疑问❓
  • 下图中,一个是char *类型的指针,一个是函数指针,两个不是同一个东西,为什么还可以传参呢 ?
    在这里插入图片描述
    》🐧 那Qt中是怎么解决上述问题的呢 ?
    在这里插入图片描述
    》🐧新语法
    connect( )函数的新语法可以在 QObject类中去查找🔍
    在这里插入图片描述


3. 自定义槽函数 🍎

》🐧所谓的 slot就是一个普通的成员函数;

》🐧自定义一个槽函数的操作过程跟自定义一个普通的成员函数没啥区别

》🐧槽函数就是用户触发某个操作之后,要进行的业务逻辑

在这里插入图片描述


  • 自定义槽函数小案例🔍
    》通过点击按钮将窗口的标题进行修改
#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(300, 200);

    connect(button, &QPushButton::clicked, this, &Widget::handleClicked);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::handleClicked()
{
    // 按下按钮,修改窗口的标题
    this->setWindowTitle("窗口的标题被修改了");
}



  • 第二种自定义槽函数的方式
    在这里插入图片描述
    》🐧Qt Creator直接给我们生成好了一个函数,在函数里面编写我们具体的逻辑即可;
    》🐧通过 connect 来连接信号槽之外,还可以通过函数名字的方式来自动连接;
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



4. 自定义信号🔍

》🐧 信号是一类非常特殊的函数

》🐧只需要写出函数声明,告诉Qt这是一个信号即可,这个函数的定义,是Qt在编译的过程中,自动生成的(无法去干预这个自动生成的过程);

》🐧作为信号函数,这个函数的返回值必须是 void,有没有参数都可以,也可以支持重载;

》🐧signals,这个是Qt扩展出来的关键字;
在这里插入图片描述


  • 如何才能触发自定义的信号呢?
    》注意:建立连接,不代表信号已经发出来了,要自己emit

在这里插入图片描述在这里插入图片描述

在这里插入图片描述


5. 带参数的信号和槽🐧

在这里插入图片描述

在这里插入图片描述

🍎 ①当信号带参数的时候,槽的参数必须和信号的参数一致

🍎 ②发射信号的时候,可以给信号函数传递实参,与之对应的这个参数就会被传递到对应的槽函数中(可以起到让信号给槽传参的效果);

在这里插入图片描述


  • 🐧传参可以起到复用代码的效果
    在这里插入图片描述

  • 信号函数的参数个数,超过了槽函数的参数个数是可以的,槽函数会按照参数顺序,拿到信号的前N个参数;
    在这里插入图片描述

  • 注意:❗在Qt中如果要让某个类能够使用信号槽,必须在类最开始的地方写下 Q_OBJECT宏;

  • Qt信号槽的特点:信号与槽之间可以” 多对多 “的方式进行关联;
    在这里插入图片描述


  • 可以使用 disconnect来断开信号槽的连接
    在这里插入图片描述

6. 使用 lambda 表达式定义槽函数

》🐧lambda表达式本质是一个 “匿名函数”,只要应用于回调函数的场景中,一次性使用;
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

;