信号和槽机制

1.概述

Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制。信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object Compiler,元组件编译器)对代码进行预处理后才能进一步进行C++代码的编译。MOC会将Qt应用程序中特有的代码自动转化为相应的标准C++语法代码。

信号和槽的概念是Qt编程中最具代表性的特点之一。GUI编程中通常使用回调函数进行事件处理,而回调函数通常是一个函数指针,不同的事件、不同的对象都有着各自的回调函数。当事件到来时,系统会通过调用对应的回调函数来完成相应的处理。

Qt引入了信号和槽机制来取代回调函数。凡是继承自QObject的类都可以具有信号和槽成员,并可以使用它们。信号和槽的使用可以有效地减少函数指针的使用,使程序代码清晰简洁,对于事件响应管理更加容易。此外,信号和槽没有严格规定函数的类型,因此在调用过程中是安全的。

信号和槽的使用可以实现信息封装,增加程序的灵活性。信号和槽都采用函数作为存在形式。在Qt程序初始化或运行的过程中,可以静态或动态地将信号和槽相关联。当某一事件到来时,会发射信号,但是发射后,它并不需要关心信号的处理者是谁。当触发槽函数时,说明与其关联的信号被接收,但它不需要了解谁发出了信号,它只需要负责进行相应的处理即可。

2.信号

信号是Qt中对事件的一种抽象,当一个事件到来时,会发射信号。所谓的发射信号,就是通过Qt中特有的通信机制,调用和信号相关的各个槽函数。因此当发射信号时,将执行与其相关联的槽函数。信号采用函数的形式,因此,当所有与信号关联的函数全部返回后,信号函数才会返回。信号函数在形式上与标准C++中的虚函数类似,信号函数只有头文件中函数的声明,而没有函数的定义(即函数体)。信号的声明形式如下:

  1. signal:
  2. void MySignal();
  3. void MySignal(int x);
  4. void MySignalParam(int x, int y);

对于信号的声明与普通的C++函数无异,它不限制参数的个数与类型,同时它还支持重载。不过信号的返回值只要求必须为void型,因为事件是一种中断,对于突发性的中断,不可能期望其有返回值。

3.槽

槽是Qt中负责信号处理的实体,当有信号发射时,与信号关联的所有槽会依次执行。槽也采用函数的形式,不过槽需要有实际的函数定义,相当于在标准C++中对虚函数的多态实现。槽函数的声明形式如下:

  1. public slot:
  2. void MySlot();
  3. void MySlot(int x);
  4. void MySlotParam(int x, int y);

与信号相同,槽函数的定义同普通的C++函数无异,支持C++函数的一些特性。同时,槽函数可以采用标准C++函数的使用方式,在代码中直接调用。槽函数具有访问权限的标识,它们同C++类的成员函数的标识相同,分别为:public、protected、private。public说明该槽函数可以被其他类的信号所关联,protected说明只能被类本身和其子类的信号所关联,private说明该槽函数只能被类本身的信号所关联。

在Qt的基类QObject中有一个成员函数用来完成信号和槽的映射,函数的原型如下:

  1. #include <QObject>
  2. static bool QObject::connect (const QObject *sender,
    const char *signal, const QObject *receiver, const char *member);

其中,sender和receiver分别指定了被关联的信号和槽的发送者和接收者。signal是信号,Qt要求必须使用宏SINGAL将信号函数指针转化为指定的类型。member是槽,Qt要求必须使用宏SLOT转化函数指针。宏SINGAL和SLOT的参数形式如下:

  1. SIGNAL(funname(param_type_1, param_type_2, …))
  2. SLOT(funname(param_type_1, param_type_2, …))

其中,funname是函数名,param_type_x是函数中对应参数的类型。

转载于:https://blog.51cto.com/5815084/971673

qt学习之路3 ---信号与槽机制相关推荐

  1. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一 ...

  2. Qt从入门到放弃——信号和槽机制(SigalSlot)

    标题信号和槽概念 Qt提供了信号和槽机制用于完成界面操作的响应,信号和槽机制是完成任意两个Qt对象之 间的通信机制.其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数. 例如,窗 ...

  3. Qt学习之路_12(简易数据管理系统)

    原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...

  4. QT学习之路2 学习笔记

    QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...

  5. 《Qt 学习之路 2》

    Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...

  6. [记录]学习QT学习之路2第四天

    今天学习内容对应<<QT学习之路2>>第18到23部分,主要是有关于QT事件这一部分的内容(=_=真是看到我快吐了,感觉这本书不适合我这种初学者). 先放出思维导图 难点总结 ...

  7. [记录]QT学习之路2学习第三天

    今天的内容对应的是<<QT学习之路2>>第13到17部分. 主要内容由思维导图总结 一,什么是QT对话框 二,什么是QT标准对话框 三,怎么样实现QT对话框数据传递 四,深入了 ...

  8. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  9. QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

最新文章

  1. 分类与逻辑回归(classification and logistic regression)
  2. 转载:识别圆环的一种思路
  3. 回滚master代码_[转]Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)...
  4. android view 源码分析,Android ViewPager源码详细分析
  5. window和linux下遍历目录的比较
  6. Spring 接收表单List集合数据
  7. Android实现系统关机和重启
  8. PHP 验证IP的合法性
  9. python小飞机程序
  10. 【数字信号调制】基于matlab 16QAM信号调制解调【含Matlab源码 2050期】
  11. 云杰恒指:9.3恒指期货早盘资讯
  12. 信息学奥赛(NOIP/CSP-J/S)学习全目录
  13. python判断素数的方法简书_深入浅出RSA在CTF中的攻击套路
  14. 《流浪地球》后续,深度对话刘慈欣:地球只是太空中的一粒尘埃
  15. OpenCV基于dlib进行人脸关键点检测(摄像头)
  16. 2021年中国强脉冲光器械行业发展趋势分析:市场规模不断增长,进口品牌占比大[图]
  17. BitLocker 秘钥如何获取
  18. android发送电子邮件,Android发送电子邮件
  19. 【python练习题3】英雄联盟英雄购买界面+数字炸弹游戏
  20. 4.6 基于反熵的状态同步

热门文章

  1. 复习之 c实现 通讯录
  2. html菜单浮动,浮动菜单,可实现上下滚动的效果
  3. 个人计算机与微型计算机的区别与联系,微处理器、微型计算机和微型计算机系统之间有何联系与区别?...
  4. PHP中三元运算符的用法_php中三元运算符用法_PHP教程
  5. java上机题四取三排列_Java练习题
  6. 万豪旅享家官方商城携手神策数据,数字化礼遇更高质量的用户体验
  7. 爬虫基础, 乱码问题, jupyter, urllib, requests, lxml, multiprocessing并发, session, beautifulsoup...
  8. selenium+chromedriver监测视频流源地址时允许flash自动启用
  9. zipkin 原理和使用
  10. C# winfrom 通过代码 删除TableLayoutPanel控件的一行或列