Qt6:如何实现可接收新语法Qt槽的函数?
改用Qt新语法实现信号槽连接
方案一:用模板参数接收成员函数指针(类型安全)
把构造函数改成模板版本,直接接收成员函数指针,编译阶段就能检查信号和槽的签名是否匹配,彻底避免旧字符串语法的运行时错误:
// 模板构造函数,兼容任意QState子类的成员函数 template<typename SlotFunc> TargetlessTransition::TargetlessTransition(BaseEvent::Id id, QState* sourceState, SlotFunc slot) : QAbstractTransition(sourceState), id_(id) { // Qt新connect语法,自动匹配信号槽 connect(this, &QAbstractTransition::triggered, sourceState, slot); }
使用时直接传成员函数地址就行:
// 示例:假设sourceState是MyState实例,槽函数是MyState::onTransitionTriggered auto transition = new TargetlessTransition(EventId, sourceState, &MyState::onTransitionTriggered);
方案二:用std::function做参数(支持lambda等灵活场景)
如果需要兼容lambda、绑定了额外参数的函数,就用std::function<void()>作为槽参数,适配各种可调用对象:
#include <functional> TargetlessTransition::TargetlessTransition(BaseEvent::Id id, QState* sourceState, std::function<void()> slot) : QAbstractTransition(sourceState), id_(id) { // 直接连接信号到std::function,Qt5+原生支持 connect(this, &QAbstractTransition::triggered, slot); }
调用示例:
// 绑定成员函数 auto transition1 = new TargetlessTransition(EventId, sourceState, std::bind(&MyState::onTransitionTriggered, sourceState)); // 直接传lambda auto transition2 = new TargetlessTransition(EventId, sourceState, [](){ qDebug() << "触发无目标状态转换"; });
注意点
- 彻底丢掉
SIGNAL()和SLOT()宏,直接用信号/槽的函数地址 - 确保槽函数的签名和
triggered()信号一致(无参数、返回值为void) - 模板方案在编译期就能发现签名不匹配的问题,比字符串语法更可靠
内容的提问来源于stack exchange,提问作者Nabuchodonozor
相关产品推荐
相关产品推荐

