Qt笔记:信号和槽


环境:Qt Creator 4.11.1


信号和槽

信号和槽是Qt中特有的消息传输机制:用户与窗口中的控件进行交互时,对应的窗口会针对特定的事件发出对应的信号。如果信号和槽进行了关联,槽就会对所关联的信号做出响应动作。

Q_OBJECT:在Qt中如果要让某个类能够使用信号槽,就必须在类最开始的地方写下这个宏
在这里插入图片描述

关联信号和槽

关联信号和槽我们需要使用QObject类中的静态成员函数connect

注意下面的connect只是其中一个重载版本,只用做说明。详情还请查看文档

QMetaObject::Connection QObject::connect(
const QObject *sender, //谁发送了信号
PointerToMemberFunction signal, //发送了什么信号
const QObject *receiver, //谁接收了信号
PointerToMemberFunction method, //怎么处理
Qt::ConnectionType type = Qt::AutoConnection)//关联类型,通常不需要设定

例: 点击按钮关闭窗口, 下面我们使用可视化生成槽
在这里插入图片描述

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

上述操作中。用户点击了按钮,按钮发出了“按钮被点击了”(clickde)的信号。clicked信号与on_pushButton_clicked槽关联。槽做出了“窗口关闭”的响应动作。

信号和事件

信号是由事件产生的,事件是用户与控件的交互过程。用户点击按钮就是一次事件,每一次事件都会发出一次信号,之后信号:“按钮被点击了”被发送。信号的本质就是事件。

槽是对信号的响应函数,其本质是一个回调函数。信号在发送时会自动执行关联的槽函数。

小细节
在这里插入图片描述

自定义信号和槽

基本语法


信号函数

信号可以用函数表示,称为信号函数。
1)信号函数必须写在“signals”下
2)信号函数返回值为void,只需声明,无需定义。(信号函数的定义是 Qt ⾃动在编译程序之前生成的。这种自动生成代码的机制称为元编程(Meta programming));
3)可以有参数,也可以有重载


槽函数

1)槽函数用public/private/protected slots修饰。高级版本的Qt允许写到public/private/protected作用域中或者全局下;
2)槽函数需要声明和定义,返回值为void;
3)可以具有任何参数,可以被重载,但是不能有默认参数;
4)槽函数的参数不能多于关联的信号函数,只能小于或等于,否则程序就会报错。推荐槽函数和信号函数参数保持一致


在这里插入图片描述

使⽤ “emit” 关键字发送信号 。事实上"emit" 是⼀个空的宏。“emit” 其实是可选的,没有什么含义,直接使用MySignal(), 同样也能发送信号。 这样是为了提醒开发⼈员这是一个信号函数。

信号函数和槽函数重载


在这里插入图片描述

不喜欢用指针的同学也可以使用Qt4的信号和槽的关联方式

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

注意:Qt4的关联方式虽然参数直观。但是参数类型不会做检测;

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

补充

我们发现在由Qt自动生成槽函数时,槽函数名为on_pushButton_clicked。这种命名方式是有规则的。自动生成的槽函数名的命名规则为 on_对象名(控件的objectName属性)_信号按照这种方式命名的槽函数,就会被Qt自动的和对应信号进行链接,这种连接方式称为隐式连接。即使不使用connect显示连接程序也可正常运行。
在这里插入图片描述

它的秘密就藏在ui文件生成的头文件ui_widget.h中

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值