当前位置: 首页 > news >正文

qt信号与槽--02

文章目录

  • qt信号与槽--02
    • 自定义槽函数
      • 第一种方式
      • 第二种方式
    • 自定义信号
      • 不带参数
      • 带参数
    • 总结
    • 结语

很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!!
在这里插入图片描述
今天我们进一步c++11中常见的新增表达
作者:٩( ‘ω’ )و260
我的专栏:qt,Linux,C++进阶,C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!

qt信号与槽–02

自定义槽函数

第一种方式

首先自定义槽函数,就跟我们之前定义的普通成员函数没有什么问题,而且之前我们已经实现过类似的方法了。
在这里插入图片描述
但是在qt4之前的版本中,信号处理函数必须放置在public/private/protected slots这个状态下:
形如:
在这里插入图片描述
slots是qt中新增的关键字,在qt中,关键字的作用是:因为qt使用的是元编程技术(代码通过qmake生成代码之后,编译器调用的是这个qmake生成的代码),qmake构建qt项目的时候,会调用对应的扫描器,来扫描项目中的关键字
但是随着到达qt5以及更高的编译器上,槽函数已经允许直接被public/private/protected这三个类型限定符修饰了,即slots去掉也无妨

第二种方式

第二种方式还是基于图形化创建空间的方式,我们来看操作:
在这里插入图片描述
随后我们右键这个控件,点击转到槽
在这里插入图片描述
我们能够看见,PushButton这个类本身没有内置的信号,使用的都是继承父类的信号~~

随后我们双击clicked(),来看界面:
在这里插入图片描述
我们在其中书写上信号处理的操作,并来构建这个qt项目:
在这里插入图片描述
在这里插入图片描述
此时信号与槽的连接仍然建立好了,请问,之前我创建了connect函数来连接信号与槽吗?既然我没有建立信号与槽的连接,那么为什么槽函数被执行了呢?
我们来观察这个槽函数的命名规则就能够获取一些答案!!

pushButton,这个是我们创建控件对象的对象名,而clicked是这个控件对象发出的信号类型,难道真的有这么巧吗?

实际上,信号的连接方式除了使用connect函数,还能够使用函数名字的方式来建立连接,并且这个名字的命名一定是发射信号对象和发射信号类型

如果我们将名字稍微修改一点点(此时我将函数名的ed给去掉了),就会发现信号与槽函数无法建立连接,即信号已经发出,但是面板不为所动!!
在这里插入图片描述
而且下方出现了这个提示!!
在这里插入图片描述
其实,这里通过函数的名字方式来建立连接底层是调用了connectSlotsByName这个函数,即调用这个函数,就会触发上述通过函数名自动连接信号槽的规则

如果此时我们将名字修改回来,再来看结果:
在这里插入图片描述

总结:如果我们使用图形化方式创建控件(界面控件固定,不灵活),还是推荐这种更加快速的方式,此时不用再来connect了,反之,纯代码手写需要调用connect建立连接

自定义信号

信号的本质是什么?可以理解为信号就是用户执行了一个操作!!

不带参数

qt中也允许自定义信号,但是这种方式不常用,因为用户能够在面板上能够执行的操作就那么几种,所以信号就那么几种。在qt内置的类中大致已经包含完全了。只有极少数情况下会自己重新设置信号~~

虽然我们Widget内部还没有定义信号,但是在继承的QWidget和QObject中,实现了许多内置的信号。

但是如果自定义信号,和我们函数差别较大。

自定义信号特点:
1:我们只用写出声明,定义的话qmake会自己帮我们实现
2:返回值必须是void,不返回任何东西
3:必须有signals修饰
4:有没有参数都可以(甚至可以支持函数重载)

同理,signal也是qt中新增的关键字,qmake调用扫描器就能够识别接下来我写的函数是一个信号。以便于qmake为信号内部生成对应的定义。

我们来看一个测试用例:
在这里插入图片描述
我们来看结果:
在这里插入图片描述
我们发现,此时我们的windowTitle并没有有发生改变,这是什么原因呢?
虽然我们建立了槽函数与信号的连接,但是此时我们的信号并没有发射,信号没有发射,当然也就不会执行对应的槽函数

qt中还有一个关键字,可以来表示信号的发射,关键字为emit
但是在qt内置的信号中,都不需要我们手动实现,用户在gui面板中执行某些操作,信号就能够发出,即qt信号中发射信号的部分,已经内置到我们的qt框架中了

在这里插入图片描述
这样信号就发射成功并执行了对应的槽函数。
而且,发射信号的代码只要是写到合适的位置都是可以的,不一定需要写到Widget的构造函数中。

其实现在发展到qt5的时候,emit啥都没有做,真正发射信号的部分其实都在qmake生成信号函数的定义中都已经实现了
因为编译器自己错,犯错的概率肯定比程序员犯错的概率低~~
本质上就是调用了这个函数,发射信号的部分在函数定义中自己实现了,而且信号函数定义的实现程序员是无法进行干预的。

带参数

信号和槽也可以带参数,此时的作用为:

通过对于发射信号的参数传递,这个参数最终会传递到槽函数中。

所以,此时,槽函数和信号的参数类型必须一致,至于个数,槽函数的参数个数必须少于信号函数。即信号参数参数更多

来看代码:
在这里插入图片描述
来看结果:
在这里插入图片描述

总结

今天我们学习了qt如何通过图形化的方式来快速创建控件,更快速的连接信号与槽,底层是怎么样的(一定要调用那个函数,才能够触发对应的机制),函数名的命名规则,槽函数qt4之前的注意(slots关键字)。
重要的就是连接槽函数的方式(connect链接,特殊函数名链接)~~

学习了信号的定义规则,三点,以及定义信号之后需要发射信号,qt中新增的emit关键字~~

学习了带参数的信号槽信号函数和槽函数参数的书写规则~~

结语

今天的内容就到这里,不足之处欢迎留言指出,感谢大家支持!!
天行健,君子以自强不息;地势坤,君子以厚德载物!加油!!
在这里插入图片描述

http://www.xdnf.cn/news/1045693.html

相关文章:

  • XR-RokidAR-UXR3.0-Draggable 脚本解析
  • 如何高效的学习算法与数据结构
  • React 实现砸金蛋游戏
  • webpack+vite前端构建工具 - 1为什么要构建工具 2webpack基础配置
  • Nginx全面深入学习目录
  • gradle在build时时如何知道要去扫描Realm相关的数据模型类的?
  • 4.查看、删除数据库
  • 数据库核心技术深度剖析:事务、索引、锁与SQL优化实战指南(第五节)----数据库事务
  • LeetCode第 454 场周赛题解
  • 【git】如何在team里使用公共账号进行ssh clone
  • leetcode25-K个一组翻转链表
  • 【Zephyr 系列 27】自定义 Shell 命令框架:打造自己的控制台命令系统
  • 数据结构 排序
  • 【狂飙AGI】第6课:前沿技术-文生图(系列2)
  • 无人机仿真时在px4包外自己的工作空间中编辑px4有关launch文件的方法
  • 小记:把react项目从web迁移到electron
  • ubuntu 22.04 安装部署elk(elasticsearch/logstash/kibana) 7.10.0详细教程
  • 【嵌入式ARM汇编基础】-快速了解ARM汇编语言
  • vSphere环境证书更新/续订案例及注意事项
  • 【CompletableFuture】基础Future (一)
  • 大模型笔记5:Agent
  • 大模型笔记2:提示词工程
  • 鸿蒙运动开发实战:打造专属运动视频播放器
  • SpringBoot新闻项目学习day2-前后端搭建以及数据查询(分页查询)
  • 「Linux文件及目录管理」文件内容的显示和处理类命令
  • 深入探究其内存开销与JVM布局——Java Record
  • RabbitMQ全面学习指南
  • ArcGIS安装出现1606错误解决办法
  • Linux-多线程安全
  • NY271NY274美光科技固态NY278NY284