Qt 信号槽
Qt4与Qt5的信号槽有些不同:
1. Qt4的槽函数必须使用slots关键字声明,而Qt5中已经不再需要了,槽函数可以是任何能和信号关联的成员函数。
2. Qt4指定信号函数和槽函数需用SIGNAL和SLOT宏,它们的功能是将参数转换为const char*类型。而Qt5中传递的是信号函数和槽函数的指针。
3. Qt5支持编译时进行检查,信号或槽的拼写错误、槽函数参数多余信号函数等错误可以在编译时就检查出来,而Qt4不行。而且参数类型不需要一致,只要能隐式转换就行。
4. Qt5还支持C++11的lambda表达式,可以在关联时直接编写信号发射后要执行的代码,不再需要声明定义槽函数了。
关于connect函数的第五个参数:
有五种类型:
Qt::AutoConnection 自动关联 (默认) 如果接受者和发送者在同一个线程,则使用Qt::DirectConnection ,否则使用Qt::QueuedConnection。 在信号被发送时决定使用哪种关联类型。
Qt::DirectConnection 直接关联 发射完信号后立即调用槽,只有当槽执行完后,发射信号处后面的代码才能继续执行。
Qt::QueuedConnection 队列关联 当控制返回接受者所在的线程才执行槽函数,而且无论槽执行与否,发射信号处后面的代码都会立即执行。
Qt::BlockingQueuedConnection 阻塞队列关联 类似于队列关联,信号线程会一直阻塞,直到槽返回。但是当接受者和发送者在同一个线程时,不能使用,否则会导致死锁。
Qt::UniqueConnection 唯一关联 使用它后,两个对象间的相同信号和槽只能有唯一的关联。通常和其他连接类型做按位或操作。
信号和槽还有一种自动关联方式:
由字符串on、部件的objectName和信号名称三部分组成,中间用下划线隔开的槽函数名称可以被QT直接关联,不用再使用conncect函数。
如on_pushButton_clicked。 不过如果这样使用,还需要进行其他的设置:使用conncectSlotsByName()函数来支持信号和槽函数自动关联。
但不建议使用这种方式,信号和槽的关联情况不明了,对其他开发人员不友好。
Qt 信号槽的更多相关文章
- Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...
- QT信号槽详解
1 QT信号槽详解 1.1 信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...
- Qt信号槽的一些事 Qt::带返回值的信号发射方式
一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...
- Qt信号槽的一些事
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- Qt信号槽-原理分析
目录 一.问题 二.Moc 1.变量 2.Q_OBJECT展开后的函数声明 3.自定义信号 三.connect 四.信号触发 1.直连 2.队列连接 五.总结 六.推荐阅读 一.问题 学习Qt有一段时 ...
- Qt信号槽源码剖析(一)
大家好,我是IT文艺男,来自一线大厂的一线程序员 大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道:也就是说大家只知道怎么使用,却不知道基于什么原 ...
- Qt信号槽源码剖析(二)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...
- (文字版)Qt信号槽源码剖析(三)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的Qt宏展开推导:今天接着深入分析,进入Qt信号槽源码剖析系列的第三节视频. Qt信号槽宏推导归纳 #define si ...
随机推荐
- WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式
接着上一章的内容,在上一章中我们知道了如何.net平台下去建立一个WebService,以及同步调用.异步调用.开线程异步调用三种客户端从服务端获取数据的方式,在本章了所要讲的,是如何将客户端的数据, ...
- ThinkPHP 一直坚挺着
ThinkPHP 一直坚挺着 从最初的 0.6 到现在的 5.2 ThinkPHP 走过了 12 年. 从 PHP 4 迭代到 PHP 7.3,每一次更新都给开源社区注入了活力. 这次国内开源软件的投 ...
- requestAnimationFrame 提高动画性能的原因
与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机.具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新 ...
- Centos 6.5 yum 安装Apache软件
首先在系统上面查询一下是否已经安装了apache 软件[Apache软件在linux系统里的名字是httpd] rpm -qa httpd 如果有返回的信息,则会显示已经安装的软件.如果没 ...
- 【python】实例-答题系统
#!/usr/bin/env python from operator import add, sub from random import randint, choice ops = {'+': a ...
- CXF运行wsdl2java :找不到系统路径
已经配置好cxf的环境变量出现 解决方法:一定要设置JAVA_HOME这个变量
- java GUI(忽略)
觉得学起来很鸡肋.就不学这玩意了
- Hadoop高级培训课程大纲-管理员版
一.课程概述 本次培训课程主要面向大数据系统管理人员和开发设计人员,基于开源社区大数据应用最活跃的Hadoop和HBase技术框架.围绕分布式文件存储(HDFS).分布式并行计算(Map/Recue) ...
- spring eureka required a bean of type 'com.netflix.discovery.DiscoveryClient' that could not be found.
spring在集成第三方过程很容易出现类名相同,且基本作用相同的类.这样给初学者带来一定的困惑. 导致用错类而出现以下问题. required a bean of type 'com.netflix. ...
- 导入wordpress数据库到mysql报错
mysql字符集编码错误的导入数据会提示错误了,这个和插入数据一样如果保存的数据与mysql编码不一样那么肯定会出现导入乱码或插入数据丢失的问题,下面我们一起来看一个例子. 恢复数据库报错:由于字符集 ...