You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:50:59