【QT 基础教程 五】QT中的信号与槽

概要:这期文章主要讲解Qt中信号和槽的概念以及信号与槽之间的连接方式。

Qt中的信号是什么?

Qt中所有的控件都可以发出信号和接收信号。在上一期,我提到将信号简单地理解为是事件的发出或者是开始。例如,现在有一个按钮的点击事件,那么,这个事件的发出是从按钮被点击这个时刻开始。

Qt中对于信号有相应的信号函数概念,除了Qt提供的控件信号函数,还可以自定义信号函数。

Qt提供的信号函数,例如:在这里插入图片描述

选择按钮 --> 右键菜单 --> 转到槽可以看到上图所示的Qt提供给QPushButton的信号函数

clicked() :点击信号
pressed() : 按压信号
released() : 释放信号
toggled(bool) : 开关信号

或者,自定义的信号函数。例如

helloworld.h

signals:
//定义一个发送数据的信号
void sendData(QString _qsData);

helloworld.cpp

//发出发送数据信号
emit sendData("");

Qt中的槽是什么?

在上一期,我提到将信号简单地理解为是对事件的响应或者是处理。对事件的处理才是我们写函数逻辑的地方。

Qt中对于槽也有槽函数的概念。在槽函数中,你可以写对于接收到这个信号的处理逻辑。
以我们写的第一个Qt项目为例:

槽函数的声明,如下图所示
在这里插入图片描述槽函数的实现,如下图所示

在这里插入图片描述

上面展示的Qt控件提供的槽函数,只需要对控件转到槽,并选择处理的信号即可,不需要手动的去写信号的发出。
下面举一个自定义的信号函数与槽函数的例子:

信号函数和槽函数的声明,如下图所示
在这里插入图片描述
信号函数的发出,槽函数的实现以及信号函数与槽函数的绑定,如下图所示
在这里插入图片描述
运行结果如下图所示
在这里插入图片描述

其中,对于自定义的信号函数,我们不仅需要自己去写它的发送,而且还需要去写该信号函数与槽函数的连接函数。

Qt中的connet()函数是什么?

connect() 是 QObject 类中的一个静态成员函数,专门用来关联指定的信号函数和槽函数。

如果自定义的信号与槽没有连接起来,那么,就算你触发了信号,程序也不会执行对应的槽函数。

接下来,简单讲解常见的connect()函数的语法格式

1.Qt4版本的写法:
connect(对象名1,SIGNAL(信号函数名),对象名2,SLOT(槽函数名));
2.Qt5版本的写法:
connect(对象名1,&对象类::信号函数名(形参),对象名2,&对象类::槽函数名(形参));
3.Lambda函数 写法:
connect(对象名1,&对象类::信号(形参),对象名2,[=]{
//接收这个信号做哪些操作
});

问:QT中支持一个信号对应多个槽吗?QT中支持多个信号对应一个槽吗?

答:都支持。

问:在一对多或者多对一的时候,槽函数的执行顺序是怎么样的?

答:槽函数的执行顺序是根据connect(连接函数)的顺序来决定的。

问:在多个信号连接一个槽的时候,我怎么知道当前执行的槽函数是哪个对象的发出的信号?

答:我们可以利用 QObject::setObjectName(const QString&) 方法在信号函数中设置信号发出者的对象名称, 然后在槽函数中利用 QObject::sender()->objectName() 方法获取信号发出者的对象名称。

问:Qt中的信号槽机制是否线程安全?

答:不绝对安全。

结尾:本期讲解关于Qt的信号与槽的机制主要就是这些,下期我们开始学习Qt的基础类:)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

葛狂的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值