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 ...
随机推荐
- lseek成功但未生效?
如果open打开文件时,指定了O_APPEND,即“追加”模式,那么lseek的向前移动指针的操作无法凑效,包括lseek(fd, 负数, SEEK_CUR)和lseek(fd, 小于当前偏移的位置, ...
- 使用C#和MSMQ开发消息处理程序
简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息, ...
- 使用gitblit搭建一个简单的局域网服务器
使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...
- 浏览器的自动翻译会影响 JS 逻辑
有人在 QQ 群里反馈,官方注册后跳转时出现 Bug. 收到群友非常有用的资讯,这是因为浏览器的自动翻译功能引起的. 11:04:21[潜水]Better Command 2017/12/30 11: ...
- java 中一些需要注意的知识点
java数组的length属性是容量,而不是数组真实元素的个数: 多线程中的interrupt()方法并不会终止处于"运行状态"的线程,它只是将线程的中断标记设为true. juc ...
- C# 文本框只能输入数字和退格键 (转)
C# 文本框只能输入数字和退格键 private void TextBox_KeyPress(object sender, KeyPressEventArgs e) { if(e.Key ...
- 【jmeter】Jmeter启动GUI界面出错
今天要用Jmeter测试服务器性能,发现GUI界面总是有warning提示: WARNING: Could not open/create prefs root node Software\JavaS ...
- 码出高效,阿里巴巴JAVA开发手册1.4.0
码出高效,阿里巴巴JAVA开发手册1.4.0阅读笔记 一.编程规约(三) 代码格式// 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag == 0) { ...
- 使用axis2的wsdl2java把wsdl生成java文件
原文地址:http://blog.csdn.net/walkcode/article/details/7661674 有时在我们的开发中可能会有这种情况就是你要使用webservice但是对方没有给你 ...
- vSphere client 登陆ESXI主机“您无权登录次服务器”
vCenter安装在虚拟机上,安装好后想调整下内存,直接把虚拟机关闭了电源,突然一想服务器都被我关了,还拿什么修改内存,完蛋! 突然想起,在使用vCenter之前,都是用vsphere client ...