一、信号与槽机制(Signal & Slot)

Qt提供好了信号和槽机制用于完成界面操作的响应,是完全任意两个Qt对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数。例如,若要将一个窗口的变化情况通知给另一个窗口部件,则一个窗口部件发送信号,另一个窗口部件的槽接收此信号并进行相应的操作,即可实现两个窗口部件之间的通信。每个Qt对象都包含若干个预定义的信号和若干个预定义的槽,当某一个特定事件发生时,一个信号被发送,与信号相关联的槽则会响应信号并完成相应的处理。当一个类被继承时,该类的信号和槽也同时被继承,也可以根据需要自定义信号和槽。

1.信号和槽机制的连接方式

(1)一个信号可以与另一个信号相连,代码如下:

connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal2));

表示Object1的信号1发送可以触发Object2的信号1发送。

这里需要注意的是,发送的信号(SIGNAL(signal1))和接收的信号(SIGNAL(signal2))都必须是函数的地址!!!

(2)一个信号可以与多个槽相连,代码如下:

connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect(Object1,SIGNAL(signal2),Object3,SIGNAL(slot3));

(3)同一个槽可以响应多个信号,代码如下:

connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect(Object3,SIGNAL(signal2),Object2,SIGNAL(slot2));

但是常用的连接方式为:

connect(Object1,SIGNAL(signal),Object2,SIGNAL(slot));

其中,signal为对象Object1的信号,slot为对象Object2的槽。

2.信号与槽机制的优点

(1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数与接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号和槽的签名不符,编译器就会报错。
(2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无须知道是哪个对象的哪个槽要接收它发出的信号,它只需做的是在适当的时间发送适当的信号就可以了,而不需要知道也不关心它的信号有没有接收到,更不需要知道是哪个对象的哪个槽收到了信号。同样,对象的槽也不知道是哪些信号关联了自己,而一旦关联信号和槽,Qt就保证了适合的槽得到了调用。即使关联的对象在运行时被删除,应用程序也不会奔溃。
一个类若要支持信号和槽,就必须从Object或QObject的子类继承。注意,Qt信号和槽机制不支持对模板的使用。

3.信号和槽机制的效率

信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能。同回调函数相比,信号和槽机制运行速度有些慢。通常,通过传递一个信号来调用槽函数将会比直接调用非虚函数运行速度慢10倍。原因主要如下:
(1)需要定位接收信号的对象。
(2)安全地遍历所有的关联(如一个信号关联多个槽的情况)。
(3)编组(marshal)/解组(unmarshal)传递的参数
(4)多线程的时候,信号可能需要排队等待。

然而,与创建对象的new操作及删除对象的delete操作相比,信号和槽的运行代价只是它们很少的一部分。信号和槽机制导致的这一点性能损耗,对实时应用程序是可以忽略的;同信号和槽提供的灵活性和简便性相比,这点性能的损失也是值得的。

4.自定义信号和槽

(1)自定义信号

  • 写道signals下
  • 返回void
  • 需要声明,不需要实现
  • 可以有参数,可以重载

(2)自定义槽

  • 返回void
  • 需要声明,也需要实现
  • 可以有参数,可以重载
  • 写道public slots下 ,也可以写到public或全局函数下

5.Qt 5 元对象(meta OBJECT)系统

Qt 5 元对象(meta OBJECT)系统提供了对象间的通信机制(信号和槽)、运行时类型信息和动态属性系统的支持,是标准C++的一个扩展,它使Qt能够更好地实现GUI图形用户界面编程。Qt5的元对象系统不支持C++模板,尽管模板扩展了标准C++的功能,但是元对象系统提供了模板无法提供的一些特性。Qt5元对象系统基于以下三个事实。

(1)基类QObject;任何需要使用元对象系统功能的类必须继承自QObject。
(2) Q_OBJECT宏:Q_OBJECT宏必须出现在类的私有声明区,用于启动元对象的特性。
(3)元对象编译器(Meta-Object Compiler,moc):为QObject子类实现元对象特性提供必要的代码实现。

二、QWidget、QDialog、QMainWindow使用原则

  • 如果需要嵌入到其他窗体中,则基于QWidget创建。
  • 如果是顶级对话框,则基于QDialog创建。
  • 如果是主窗体,则基于QMainWindow创建。

企业级C++项目那些事(2):Qt相关基础概念相关推荐

  1. WiFi相关基础概念

    转自:https://blog.csdn.net/lbaihao/article/details/73250798 一.WiFi相关基础概念 1.什么是wifi 我们看一下百度百科是如何定义的: Wi ...

  2. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念

    linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  3. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

    linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...

  4. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

    linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. SEO究竟是什么?SEO的相关基础概念介绍

    可能对于刚接触优化的新手来说,要明白SEO是什么,只有了解之后才能有进一步的学习以及提升.在互联网搜索引擎中,已经有了大量的相关资料以及定义.不同的人会用不同的语言来解释SEO是什么,但是最终的结果是 ...

  6. linux设备驱动归纳总结(一)内核的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...

  7. 企业级C++项目那些事(1):VSQt相关设置

    写在前面: 刚入职接收一个项目,mentor就把项目源码发给我们几个菜鸟,所分配的任务是做个Qt界面,这对之前从事深度学习算法研究的我着实有点棘手.至于为什么校招不招算法类的岗位,而专门找了个C++开 ...

  8. 并发编程基础篇——第一章(并发相关基础概念理解)

    其实讲到并发编程,有时候会问自己为什么要去做这些知识的积累和沉淀,可能我们做业务的在职业生涯里,并不会经常使用到这些所谓的多线程编程,顶多可能开一个线程,去执行个任务,又或者通过定时器触发某个业务,实 ...

  9. Linux设备驱动归纳总结(一):内核的相关基础概念

    目录 一.Linux设备驱动的作用: 二.内核代码树介绍: 三.内核补丁: 四.内核中的Makefile: 五.子目录下的Makefile和Kconfig: 六.内核和模块的编译 七.总结 一.Lin ...

最新文章

  1. Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装
  2. 搜集来的命令集合,挺好的
  3. React学习:脚手架搭建、antd引入-学习笔记
  4. Linux中使用crontab命令启用自定义定时任务
  5. 使用ASP.NET Core MVC的Vue.Js
  6. KDD2021|小红书在推荐多样化的实践——SSD
  7. 【整理】Laravel中Eloquent ORM 关联关系的操作
  8. Linux/Ubuntu下解压命令
  9. CTP:rust封装找不到thostmduserapi_se、thosttraderapi_se问题
  10. h5打开android的app的具体页面,通过H5打开app,进入到指定页面
  11. php库存负数,erp系统为什么库存结存单价为负数
  12. 前端入门视频笔记 CSS3(一) P61-92
  13. 免费ftp服务器软件,实用的3款免费ftp服务器软件
  14. 2021高考倒计时HTML源码,2021高考倒计时
  15. 人生于世上,有几个知己……
  16. Linux C遍历文件夹
  17. 区块链技术运用在票据领域-票据链
  18. 面向对象程序有哪些优点呢?
  19. 居然有人问,软件测试算是程序员吗?
  20. 【电机】使用Simulink建立BLDC反电动势测量的简单模型

热门文章

  1. abaqus的三维几何体建模插件(线条/圆柱/椭球/球体)--Abaqus Geometry 2.0
  2. Android中Seekbar简单用法
  3. python编程入门到实践学习笔记——外星人入侵游戏pygame(一 武装飞船)
  4. java基于springboot+vue的在线投票系统
  5. 树讲解(5)——医院设置
  6. 简单部署discuz论坛和phpwind论坛
  7. 大数据里细看苏州旅游新变化
  8. [自己做个游戏服务器二] 游戏服务器的基石-Netty全解析,有例子,多图解释
  9. Android 8.1拨号如何实现默认免提
  10. BUUCTF 逆向工程(reverse)之内涵的软件