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