在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败
当信号和槽在不同线程时,默认使用 队列连接(Qt::QueuedConnection),信号会被放入接收线程的事件队列,等待事件循环处理。
不带参数的信号:不需要传递参数,Qt 无需序列化数据,仅需传递信号类型本身(元对象系统已隐式注册信号类型)。
带参数的信号:需要将参数从发送线程拷贝到接收线程。
Qt 要求:
参数类型必须通过 qRegisterMetaType<T>() 注册到元对象系统。
内置类型隐式注册
Qt 已为 int、QString 等基础类型隐式调用了 qRegisterMetaType,因此它们可以直接用于跨线程信号槽的参数传递。
但枚举类型(包括 enum 和 enum class)需要显式注册。
枚举类型未被元对象系统识别
如果枚举类型未通过 Q_ENUM 或 Q_ENUM_NS 注册到 Qt 元对象系统,Qt 无法在跨线程时序列化枚举值。
即使调用了 qRegisterMetaType,若未使用 Q_ENUM,注册会失败。
枚举作用域问题
enum class(强类型枚举)需要完整作用域名称注册,例如 qRegisterMetaType<MyClass::MyEnum>("MyClass::MyEnum")。