Qt两种信号-槽连接语法的区别(一)
自Qt5.0开始,Qt提供了两种不用的信号槽连接语法:
- 基于字符串的连接(string-based)
- 基于函数子的连接(functor-based)
这两种连接语法各有利弊:
| string-based | functor-based | |
|---|---|---|
| 类型检查时间 | 运行时 | 编译时 |
| 能否执行隐式类型转换 | 否 | 可 |
| 能否连接lambda表达式 | 否 | 可 |
| 能否将信号连接至更多参数的槽 | 可 | 否 |
| 能否将信号连接至QML函数 | 可 | 否 |
| 选择信号或槽的重载 | 简单 | 复杂 |
类型检查和隐式类型转换:
基于字符串的连接通过运行时字符串比对进行类型检查,这种方式有三种局限性:
- 连接错误只能在程序运行后才能被检测到
- 信号和槽之间无法进行隐式类型转换
- 无法解析类型定义和名称空间
限制2和3存在,是因为字符串比较器不能访问C++类型信息,因此依赖于精确字符串匹配。
相反,基于函数子的连接在编译时会被编译器检查,捕获连接错误,启用兼容类型之间的

本文探讨了Qt5中两种信号-槽连接方式的差异,包括基于字符串和基于函数子的连接。基于字符串的连接在运行时检查类型,可能导致连接错误仅在运行后发现,且不支持隐式类型转换和类型定义解析。而基于函数子的连接则在编译时进行类型检查,允许隐式转换并能识别类型和名称空间。
最低0.47元/天 解锁文章
1867

被折叠的 条评论
为什么被折叠?



