一、信号槽机制原理

1、如何声明信号槽

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

class Example: public QObject
{
Q_OBJECT signals:
void customSignal();
void customSignal(int i)
public slots:
void customSlot();
void customSlot(int i);
};

2、宏与MOC源对象

摘录代码:

// qobjectdefs.h
i. …
ii. #define slots
iii. #define signals public
iv. …
v. #define emit
vi. …

为什么需要MOC?

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

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

二、信号槽的发展与使用

Qt5之前的写法:

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

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

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

Qt5新写法:

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

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

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

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

 常用信号槽用法:

• QtDesigner创建
• void Example::on_pushButton_clicked(){...}
• connect(sender, SIGNAL(customSignal(int i)),
receiver, SLOT(customSlot(int i)));
• connect(sender, &Sender::customSignal,
receiver, &Receiver::customSlot);
• connect(sender, &Sender::customSignal,custonSlot);
• connect(this, &Example::customSignal,[=](int i){
cout << "Resule: " << i;
}

三、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. esp8266(0) AT指令

    http://www.shaoguoji.cn/2017/01/15/ESP8266-usage/ 注意事项 使用WiFi模块的一些细节及注意事项 模块使用3.3V供电,一定注意电源的稳定,一些USB ...

  2. oracle批量插入数据(测试)

    做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法.产生测试数据的SQ ...

  3. 说说CDN

    本文今天主要讲解三个方面: 第一.没有CDN之前采取的常用策略是什么; 第二.CND的概念; 第三.CDN的优点和缺点(凡是有利也有弊,任何东西都是相对的); 一.没有CDN之前采取的常用策略是什么 ...

  4. QT获取窗口大小和位置等信息

    QT窗口尺寸,窗口大小和大小改变引起的事件 QResizeEvent. 来源:http://blog.csdn.net/dbzhang800/article/details/6741344?reloa ...

  5. Vue 改变数组中对象的属性不重新渲染View的解决方案

    Vue 改变数组中对象的属性不重新渲染View的解决方案 在解决问题之前,我们先来了解下 vue响应性原理: Vue最显著的一个功能是响应系统-- 模型只是一个普通对象,修改对象则会更新视图.受到ja ...

  6. 广告牌LED灯阵

    大家都知道广告牌里面原来都是灯管,现在开始更换成LED灯了,下面是我在现场拍的图片: 下面这个图片是LED灯条,铝基板打印电路,TM1812驱动,该IC可以接受4组24位数据,然后转发数据(https ...

  7. 【Codeforces Round 1137】Codeforces #545 (Div. 1)

    Codeforces Round 1137 这场比赛做了\(A\).\(B\),排名\(376\). 主要是\(A\)题做的时间又长又交了两次\(wa4\)的. 这两次错误的提交是因为我第一开始想的求 ...

  8. 开发工具|给你的项目买份保险:Python虚拟环境

    读完需要 9 分钟 1. 什么是虚拟环境? 虚拟环境的意义,就如同 虚拟机 一样,它可以实现不同环境中Python依赖包相互独立,互不干扰.这在一定程度的意义上,给了我们的项目一份很有力的保障.在这里 ...

  9. DefWindowProc是一个会产生消息的函数

    先看一道题目: 当用户点击右上角关闭按钮的时候,请给下列Windows做出的响应排个序:A:发送 WM_QUIT 消息     B:发送 WM_CLOSE 消息     C:发送 WM_DESTROY ...

  10. 【知识整理】这可能是最好的RxJava 2.x 入门教程(一)

    一.前言 这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(完结版)[强力推荐] 这可能是最好的RxJava 2.x 入门教程(一) 这可能 ...