Qt知识笔记(三)—— 信号与槽

概述

信号槽是Qt特有的机制。

信号槽,实际上是观察者模式 (发布 - 订阅模式)。当某个事件发生之后,就会发出一个信号,这种信号是没有目的的,如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,即将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。就像类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

信号的本质就是事件,如鼠标单机,释放等操作,按钮按下等。
Qt中我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件,Qt中信号的发出者是某个实例化的类对象,对象内部可以进行相关事件的检测。
槽的本质是一类具有特殊功能的函数,可以作为类的普通成员函数来使用。可以对 Qt 框架中产生的信号进行处理。槽函数的所有者也是某个类的实例对象。

标准信号槽的使用

在 Qt 中我们需要使用 QOjbect类中的 connect 函数进行二者的关联。

Qt类内部自带的信号称为标准信号。Qt类内部提供的功能函数可以作为触发信号的处理动作,称为标准槽函数。

标准信号和槽可以通过Qt助手查阅,如果没有找到并不代表没有,可以看当前类从父类继承下来了哪些信号。

// 单击按钮关闭窗口
//其中参数依次为:信号发出者,发出的信号,信号的接收者,槽函数
connect(ui->closewindow, &QPushButton::clicked, this, &MainWindow::close);

自定义信号槽的使用

除了Qt自带的信号槽,我们可以使用自定义的信号槽。如果想要在Qt类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:

要编写新的类并且让其继承Qt的某些标准类
这个新的子类必须从QObject类或者是QObject子类进行派生
在定义类的头文件中加入 Q_OBJECT 宏

自定义信号对应的函数只有声明,没有定义。自定义信号是有条件的。

信号是类的成员函数
返回值必须是 void 类型
信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
发送信号的本质就是调用信号函数:emit 函数名

自定义槽也是有条件的。

返回值必须是 void 类型
槽函数需要指定多少个参数, 需要看连接的信号的参数个数
槽函数的参数是用来接收信号传递的数据的, 信号传递的数据就是信号的参数
Qt 中的槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式

注意事项

一个信号可以连接多个槽函数

需要写多个connect()连接
槽函数执行顺序是随机的,与connect调用顺序无关
信号接收者可以是一个或多个对象

一个槽可以连接多个信号,多个不同信号处理动作是相同的

需要写多个connect()连接

信号可以连接信号

信号接收者可以不处理接收的信号,而是继续发射新的信号,这相当于传递了数据,并没有对数据进行处理

信号槽可以断开

使用语法

//方式一
connecct(ui->button,SIGNAL(clicked()),this,SLOT(onButton()));
//方式二
connect(ui->button,&QPushButton::clicked,this,&SignalSlot::onButton);
//方式三
connect(ui->button,&QPushButton::clicked,this,[=](){...});
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值