文章目录
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
表达式本质是一个 “匿名函数”,只要应用于回调函数的场景中,一次性使用;