一、信号槽机制原理

1、如何声明信号槽

Qt头文件中一段的简化版:

  1. class Example: public QObject
  2. {
  3. Q_OBJECT
  4.  
  5. signals:
  6. void customSignal();
  7. void customSignal(int i)
  8. public slots:
  9. void customSlot();
  10. void customSlot(int i);
  11. };

2、宏与MOC源对象

摘录代码:

  1. // qobjectdefs.h
  2. i.
  3. ii. #define slots
  4. iii. #define signals public
  5. iv.
  6. v. #define emit
  7. vi.

为什么需要MOC?

由于c++原生并没有提供内省,而Qt的信号槽和属性列表是基于内省的,通过内省能很方便的列出对象的方法和属性列表,可以说Qt的信号槽是决定类型安全的。

详细信息可参考:解析Qt内省机制 (所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力)

二、信号槽的发展与使用

Qt5之前的写法:

  1. connect(sender, SIGNAL(customSignal(int i)),receiver, SLOT(customSlot(int i)));

缺点:没有编译器检查,因为信号和槽函数被处理成了字符串,编译器不能在编译时检查错误,所有的检查是在运行时完成的。这样可能会出现编译通过槽却没被调用的情况,

只能在控制台中查看错误提示了。

Qt5新写法:

  1. connect(sender, &Sender::customSignal,receiver, &Receiver::customSlot);

与之前语法很像,新的信号槽特性:

  • 新的语法
  • 编译器检查
  • 友好的错误提示
  • 自动参数类型转换
  • 允许连接任意函数(使用了函数指针,直接调用函数,所以槽不用经过MOC处理。信号还是需要MOC处理即需要在特定区域声明)

  • c++lambda表达式(可以任性的写成如下格式)
  1. connect(this, &Example::customSignal,[=](int i){
  2. cout << "Resule: " << i;
  3. }

 常用信号槽用法:

  1. QtDesigner创建
  2. void Example::on_pushButton_clicked(){...}
  3. connect(sender, SIGNAL(customSignal(int i)),
  4. receiver, SLOT(customSlot(int i)));
  5. connect(sender, &Sender::customSignal,
  6. receiver, &Receiver::customSlot);
  7. connect(sender, &Sender::customSignal,custonSlot);
  8. connect(this, &Example::customSignal,[=](int i){
  9. cout << "Resule: " << i;
  10. }

三、Qt组件与信号连接 

简单的加法器:

ui界面设计为

右击pushbutton选择转到槽选择clicked方法,会在summator里自动生成并编辑代码,运行

可参考其他文章:QT的信号与槽机制介绍

Qt开发之信号槽机制的更多相关文章

  1. Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...

  2. QT信号槽机制

    信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...

  3. C++11实现Qt的信号槽机制

    概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...

  4. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...

  5. QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...

  6. QT写hello world 以及信号槽机制

    QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...

  7. 非Qt工程使用Qt的信号槽机制

    非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All ...

  8. QT学习记录之理解信号槽机制

    作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...

  9. QT中的信号槽

    只有继承了QObject类的类,才具有信号槽的能力.所以,为了使用信号槽,必须继承QObject. 凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT. 不管是 ...

随机推荐

  1. 20145203盖泽双 《网络对抗技术》实践九:Web安全基础实践

    20145203盖泽双 <网络对抗技术>实践九:Web安全基础实践 1.实践目标 1.理解常用网络攻击技术的基本原理. 2.Webgoat下进行相关实验:SQL注入攻击.XSS攻击.CSR ...

  2. nodejs stream 手册学习

    nodejs stream 手册 https://github.com/jabez128/stream-handbook 在node中,流可以帮助我们将事情的重点分为几份,因为使用流可以帮助我们将实现 ...

  3. 扫盲记-第六篇--Normalization

    深度学习模型中的Normalization 数据经过归一化和标准化后可以加快梯度下降的求解速度,这就是Batch Normalization等技术非常流行的原因,Batch Normalization ...

  4. AI 循环神经网络(RNN)

    循环神经网络(Recurrent Neural Network,简称RNN),通常用于处理序列数据.正如卷积神经网络通常用于处理网格数据(例如图像)一样. 1.展开计算图 输入.输出.记忆 权值 2. ...

  5. *** Collection <__NSArrayM: 0x600000647380> was mutated while being enumerated.

    *** Collection <__NSArrayM: 0x600000647380> was mutated while being enumerated.

  6. 【Codeforces Round 464】Codeforces #265 (Div. 1)

    模拟RD265 ABC三题,Rank58 Codeforces 464 A 题意:给定一个字符串,求比这个字符串字典序大并且和它长度相等的第一个不含有长度大于等于2的回文串的字符串. 思路:首先我们枚 ...

  7. date日期 格式化

    这个是别人写的,我拿过来用的,哈哈 Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth() ...

  8. [05] EL表达式

    1.概述 EL = Expression Language 表达式语言,用来在JSP中替代<%=%>的数据表达方式,EL更简洁,它的语法如下: ${...} 1   1 ${...}   ...

  9. Docker中运行Dockerfile时报错“cannot allocate memory”

    今天运行Dockerfile脚本时报错了,现记录下来: Step / : RUN -bin/myagent symlink /proc/mounts /var/lib/docker/overlay/2 ...

  10. java异步编程降低延迟

    目录 java异步编程降低延迟 一.ExecutorService和CompletionService 二.CompletableFuture(重要) 三.stream中的parallel(并行流) ...