结论:
旧版信号槽机制(SIGNAL
和 SLOT
宏)在运行时才解析信号和槽的名称,不会在编译或链接阶段进行类型检查。当你使用 SIGNAL(clicked())
和 SLOT(do_FontColor())
的旧语法时,这些内容会被预处理为字符串(例如 "clicked()"
和 "do_FontColor()"
)。这些字符串仅仅在程序运行时才会被 Qt 的元对象系统(Meta-Object System, MOC)进行解析并尝试匹配。
问题详情:

恰好碰到编辑工具代码补全失效,就手动敲函数名,成功构建后无法实现预期功能(点击按钮文本变色),开始着手检查,发现在调试模式下运行,qt creator下方已经输出了相关的提示信息:
可以看到刚好有两个提示,分别对应拼写错误的两处。
改进:使用新语法
新旧语法对比:
旧语法:
connect(ui->radioButton_blue, SIGNAL(clicked()), this, SLOT(do_FontColor()));
- 信号和槽通过字符串解析,编译器无法检查有效性。
- 拼写错误只能在运行时发现。
新语法:
connect(ui->radioButton_blue, &QRadioButton::clicked, this, &Dialog::do_FontColor);
- 信号和槽通过函数指针绑定,编译阶段即可验证有效性。
- 拼写错误会在编译期直接报错。
【注】do_FontColor()为自定义函数